関連する問題をデバッグしているときに、pgrepが一見任意のコマンドラインパターンのPIDを返していることに気付きました。例:
$ Sudo pgrep -f "asdf"
13017
$ Sudo pgrep -f ";lkj"
13023
$ Sudo pgrep -f "qwer"
13035
$ Sudo pgrep -f "poiu"
13046
$ Sudo pgrep -f "blahblahblah"
14038
$ Sudo pgrep -f "$(pwgen 16 1)"
14219
Sudoを使用しない同じコマンドは、(予想どおり)何も返しませんでした。
$ pgrep -f blahblahblah
コマンドが何であるかを確認するために、PIDをpsにパイプしようとしましたが、機能しませんでした。
$ Sudo pgrep -f blahblahblah | xargs ps -f -p
UID PID PPID C STIME TTY TIME CMD
プロセスの終了が早すぎるようです。次に、psとgrepを使用してみましたが、それも機能しませんでした(つまり、結果がありませんでした)。
$ Sudo ps -e -f | grep [a]sdf
$ Sudo ps -e -o command | grep asdf
grep asdf
また、コマンドをすばやく再実行すると、PIDが着実に上昇しているように見えることにも気づきました。
$ for i in $(seq 1 10); do Sudo pgrep -f $(pwgen 4 1); done
14072
14075
14078
14081
14084
14087
14090
14093
14096
14099
$ for i in $(seq 1 10); do Sudo pgrep -f blahblahblah; done
13071
13073
13075
13077
13079
13081
13083
13085
13087
13089
健全性チェックとして、findとgrepを使用してprocディレクトリを検索してみました。
$ Sudo find /proc/ -regex '/proc/[0-9]+/cmdline' -exec grep adsfasdf {} \;
Binary file /proc/14113/cmdline matches
Binary file /proc/14114/cmdline matches
$ Sudo find /proc/ -regex '/proc/[0-9]+/cmdline' -exec grep adsfasdf {} \;
Binary file /proc/14735/cmdline matches
Binary file /proc/14736/cmdline matches
ここでも、PIDが上昇しており、コマンドラインが任意の文字列と一致しているようです。
CentOS6.7とUbuntu12.04の両方でこれを試したところ、同じ結果が得られました。 Macで同様の実験を試みたところ、テストはネガティブに戻りました。謎のプロセスはありませんでした。
何が起きてる?
これは、Sudo
プロセスを示しています。つまり、PIDは、Sudo
の後に置くことで実行しているpgrep
コマンドの親であるSudo
プロセスのPIDです。 。コマンドライン全体を(-f
で)検索すると、文字列(パターン)も元のSudo
の一部であるため、Sudo
プロセスが出力にポップアップ表示されます。コマンド。
-l
と-a
(pgrep
がサポートしている場合)を使用すると、より良いアイデアが得られます。
テスト:
% Sudo pgrep -af "asdf"
4560 Sudo pgrep -af asdf
% Sudo pgrep -lf "asdf"
4562 Sudo
% pgrep -af "asdf"
%
「-f」を使用して検索している文字列は、Sudoの完全なSudo
リストにも含まれているため、ps
コマンドが検出されます。
基本的に、Sudo pgrep -f xyz
を実行すると、
PID1 Sudo pgrep -f xyz
PID2 pgrep -f xyz
Pgrepコマンドは両方を検出し、それ自体を無視し、PID1を一致として報告します。
実行するたびに新しいSudo
コマンドがあるため、当然PIDは増加します。