実行中のアプリケーションがあります。
$ ps -ef | grep hello_world
steve 9607 1816 0 09:11 ? 00:00:00 ./hello_world
steve 10093 21566 0 09:18 pts/4 00:00:00 grep hello_world
pgrep -f
パターンを使用してpidを検索できます。
$ pgrep -f ./hello_world
9607
$ echo $?
0
$ pgrep -f hello_world
9607
$ echo $?
0
ただし、次のようにpgrep -x
検索すると精密パターンマッチング、何も返さない
$ pgrep -x ./hello_world
$ echo $?
1
$ pgrep -x hello_world
$ echo $?
1
/proc
ファイルシステムで正しいコマンドラインを確認すると、次のものが返されます。
$ cat /proc/9607/cmdline
./hello_world
私はなぜpgrep -x
失敗するか。
答え1
$ pgrep -x ./hello_world $ echo $? 1
最初の式が一致しない理由は、正確なプロセス名の一致(例にpgrep
プロセス名が含まれている)を見つけるように要求しましたが、検索文字列を指定したためです。hello_world
./hello_world
$ pgrep -x hello_world $ echo $? 1
2番目の検索がなぜ効果がないのかわかりません。 Ubuntu 14.04用なので、投稿にバグがあるか、最新バージョンにバグがあります。
$ ./dd &
[1] 6377
$ pgrep -x dd
6377
答え2
procpsと正規表現のマッチング実装がpgrep -x
壊れているようです。
$ /bin/sleep 9& pgrep -x 'sleep'
[1] 8472
8472
$ /bin/sleep 9& pgrep '^sleep$'
[2] 8485
8472
8485
$
マンページを読むと、両方ともnullを返す必要があります。
それについて考えてみてくださいpidof
。
人々がラッパースクリプトを除外する迷惑な状況があります。この場合、次のような状況が発生しますsleep
。
#!//bin////bash
echo "Script PID: $$"
/bin/sleep 1&
pgrep -ax sleep
出力は次のとおりです
Script PID: 12973
12973 //bin////bash ./sleep
12974 /bin/sleep 1