web-dev-qa-db-ja.com

正規表現を使用してUNIXプロセスが稼働しているかどうかを確認する

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
sandeep

コマンドpgrepは、grep互換の正規表現に一致するすべてのプロセス(それ自体を除く)のPIDのリストを出力します。

一致するものがない場合は何も出力しません。

これは十分なテストであるはずです。プロセスが実行されている場合、[ $(pgrep process | wc) -gt 0 ]はtrueです。そうでない場合はFalse。

3
greyfade

私はpsgに精通していませんが、ps ax | grep prognameを実行して、prognameを含むプロセスが実行されているかどうかを確認するかどうかは(いわば難しい方法ですが)知っています。 grep progname自体が「progname」を含むコマンドであるため、 'は常にyesを取得します。

私はPerlを知りませんが、bashでは、このように回避します。たとえば、prognameのインスタンスが実行されているかどうかを確認したい場合は、ps ax | grep -c "[p]rogname"を実行します。これにより、常にyesになるという問題が解決されます。 。

2
frabjous

正規表現m/dtllst $myNode | $myNode/は、(特に)$myNodeの出現に一致します。構造上、psg dtllst | grep $myNode$myNodeに一致するものを返すため、正規表現は常に一致します。

他の人のアドバイスに従えず、pgrepまたはps ... | grepまたはその変形を使用できない場合は、次のいずれかを行うことができます。

  1. set "$ checkProc = psg dtllst | grep 'dtllst $myNode';"次に、$checkProcが空でないかどうか、または

  2. set "$ checkProc = psg dtllst;"次に、それをm/dtllst $myNode/と照合します

  3. Proc :: ProcessTable CPANモジュールを使用して、$pのようなエントリ$p->cmdline =~ m/dtllst $myNode/を検索します。

2
Riccardo Murri

それがあなたが探しているものであるかどうかはわかりませんが、これがあなたのプログラムの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
_
0
polemon