UNIXでは、次のコマンドを実行して、プロセスが稼働しているかどうかを確認しています。
例えば。
psg dtllst pe99
プロセスが実行中の場合、これは次の出力を返します。
UID PID PPID C STIME TTY TIME CMD
pe99 1234 1 0 03:29:44 pts/8 0:01 dtllst pe99
今Perlで、私はこのプロセスが稼働しているかどうかを調べたいと思っています。これまで私は次のことをしています
`my $checkProc = `psg dttlst | grep $myNode 2>&1`;` #where $myNode is something like pe01 or pe02 or pe65 or pe99 etc...
この後、次の手順を実行して、上記のPerlコマンドが探しているものを返したかどうかを確認し、プロセスが稼働しているかどうかを確認します。
if ($checkProc =~ m/dtllst $myNode | $myNode/) {
#yes, process is up
} else {
#no, process is down
}
ただし、これは機能していません。具体的には、UNIXプロセスが動作しているかどうかに関係なく、私のコードは常にifステートメントをtrueと評価します。私はこれが間違っていることを知っています。これが問題であるかどうかを確認するために、正規表現の「$」文字をエスケープしようとしました。また、正規表現内からPerl変数を完全に削除しようとしました。
ここで何が欠けていますか?私は私の正規表現がどこか間違っていることを知っています:(
ありがとう
コマンドpgrep
は、grep
互換の正規表現に一致するすべてのプロセス(それ自体を除く)のPIDのリストを出力します。
一致するものがない場合は何も出力しません。
これは十分なテストであるはずです。プロセスが実行されている場合、[ $(pgrep process | wc) -gt 0 ]
はtrueです。そうでない場合はFalse。
私はpsg
に精通していませんが、ps ax | grep progname
を実行して、progname
を含むプロセスが実行されているかどうかを確認するかどうかは(いわば難しい方法ですが)知っています。 grep progname
自体が「progname」を含むコマンドであるため、 'は常にyesを取得します。
私はPerlを知りませんが、bashでは、このように回避します。たとえば、prognameのインスタンスが実行されているかどうかを確認したい場合は、ps ax | grep -c "[p]rogname"
を実行します。これにより、常にyesになるという問題が解決されます。 。
正規表現m/dtllst $myNode | $myNode/
は、(特に)$myNode
の出現に一致します。構造上、psg dtllst | grep $myNode
は$myNode
に一致するものを返すため、正規表現は常に一致します。
他の人のアドバイスに従えず、pgrep
またはps ... | grep
またはその変形を使用できない場合は、次のいずれかを行うことができます。
set "$ checkProc = psg dtllst | grep 'dtllst $myNode'
;"次に、$checkProc
が空でないかどうか、または
set "$ checkProc = psg dtllst
;"次に、それをm/dtllst $myNode/
と照合します
Proc :: ProcessTable CPANモジュールを使用して、$p
のようなエントリ$p->cmdline =~ m/dtllst $myNode/
を検索します。
それがあなたが探しているものであるかどうかはわかりませんが、これがあなたのプログラムのPIDを取得する方法です:
_ps -e -o pid= -o args= | sed 's/^\s*//' | grep 'dtllst pe99' | cut -d' ' -f1
_
これにより、指定されたコマンドのPIDが引数付きの場合、すべてが出力されます。
必要に応じて、これを使用して別のプログラムにパイプすることができます。すべてのPIDが一度に必要な場合は、すべてを$()
でラップできます。
_MyPIDs=$(ps -e -o pid= -o args= | sed 's/^\s*//' | grep 'dtllst pe99' | cut -d' ' -f1)
echo $MyPIDs
_