
関連する問題のデバッグ中に、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が再び上昇するように見え、cmdlineはすべての文字列と一致します。
CentOS 6.7とUbuntu 12.04で試しましたが、同じ結果が得られました。 Macで同様の実験を試みたとき、テスト結果は音声として現れました。神秘的なプロセスはありませんでした。
ここで何が起こっているのでしょうか?
答え1
つまり、PIDはsudo
実行中のコマンドsudo
の親プロセスPIDです。コマンドライン全体を検索すると、文字列(パターン)も生の部分なので、プロセスが出力に表示されます。コマンドの。pgrep
sudo
-f
sudo
sudo
-l
and -a
(サポートしている場合)を使用すると、pgrep
より良いアイデアを得ることができます。
テスト:
% sudo pgrep -af "asdf"
4560 sudo pgrep -af asdf
% sudo pgrep -lf "asdf"
4562 sudo
% pgrep -af "asdf"
%
答え2
sudo
"-f"で検索する文字列がps
sudoの完全なリストにもあるので、コマンドを探しています。
デフォルトでは走る時はsudo pgrep -f xyz
走ります。
PID1 sudo pgrep -f xyz
PID2 pgrep -f xyz
pgrepコマンドは両方とも探して自分自身を無視し、PID1を一致すると報告します。
sudo
実行されるたびに新しいコマンドが出てくるので、PIDは自然に増加します!