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変数を完全に削除してみました。
私がここで何を見逃しているのでしょうか?私の正規表現がどこかに間違っていることを知っています:(
ありがとう
答え1
このコマンドは、互換pgrep
性のある正規表現に一致するすべてのプロセス(自体を除く)のPIDリストを印刷しますgrep
。
一致するものがなければ、何も印刷されません。
これは十分なテストでなければなりません。[ $(pgrep process | wc) -gt 0 ]
プロセスが実行中の場合は true です。なければ偽です。
答え2
私はそれに慣れていませんが、プロセスが実行されていることを確認するために実行すると、include自体を含む "progname" Orderであるため、常に肯定的な答えが得られることをpsg
(言えば難しい方法で)知っています。ps ax | grep progname
progname
grep progname
私はPerlを知りませんが、bashではこの問題を次のように解決できます。たとえば、progname インスタンスが実行中であることを確認したい場合、実行するとps ax | grep -c "[p]rogname"
常に「yes」が表示される問題が解決されます。
答え3
あなたの正規表現はm/dtllst $myNode | $myNode/
(具体的に)すべての項目と一致します$myNode
。構成によってpsg dtllst | grep $myNode
一致する項目が返されるので、正規$myNode
表現は常に一致します。
pgrep
他人の提案、使用、またはps ... | grep
変形に従えない場合は、次のことができます。
"$checkProc =
psg dtllst | grep 'dtllst $myNode'
;" を設定し、$checkProc
空でないことをテストします。「$checkProc =
psg dtllst
;」を設定し、次のように組み合わせます。m/dtllst $myNode/
使用プロセス::プロセステーブル
$p
CPANモジュール、アイテムを検索するだけです。$p->cmdline =~ m/dtllst $myNode/
答え4
これがあなたが望むものかどうかはわかりませんが、プログラムの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