動き
以上
(打ち間違えすぎ)(pgrepは-aがfullなので-lは冗長)
まとめ
(テーブル記法にパイプ使えない)
コマンド毎の不要な出力増加数。
(sudo)は有無が結果に影響しないと考えている部分。
プロセス名を対象とした場合
ps ax | grep hoge
grep
自身がgrep
に引っかかり、+1
(sudo) ps ax | sudo grep hoge
grep
自身とsudo
が引っかかり、+2
pgrep hoge
コマンドラインには反応しないので、+0
sudo pgrep hoge
コマンドラインには反応しないので、+0
pgrep -f hoge
grep
と異なり、自身は対象外になるのか、+0
sudo pgrep -f hoge
sudo
のコマンドラインに反応して、+1
(sudo) ps ax | sudo grep hoge | (sudo) grep -v grep
grep -v grep
が、sudo grep hoge
、grep hoge
、grep -v grep
を消し、+3 → +0。最後にsudo
を付けても同様に+4 → +0(推測)
冗長そうなgrep -v grep
が一番安全。
pgrep
も-f
を付けずプロセス名に限定するならば安全。
だが、引数駆動している場合、ex)php ファイル名
コマンドラインが対象で全体含めて検索したいなら該当してしまう。
メモ
プロセスチェックしませんか。重複起動防止などに。
ps ax | grep hoge
すると、grep hoge
しようとしているgrepコマンド自体も引っかかってしまうことは有名。
なので更に
grep -v hoge
したり、
wc -l
の結果から1引いたり、
pgrep
つかおう!
となります。
一方sudo
は、うっかりapacheユーザーで権限エラーが出るのを防いだり、実行コマンドがログとして残ったり、パスが通ってなくて死んだりおまじない的、セキュリティ的に付与されることがあります。
私もいっとき全部のコマンド呼び出しにsudo
追加してくれと言われたり、逆に毎分の処理でログが出過ぎてなんとかして欲しいなどと言われました。
そんなsudo
は、あくまでsudo
で一コマンド。後続の実行コマンドはというと、
sudo は、コマンドを実行するとき、まず fork(2) を呼び、 実行環境を上記のように設定してから、子プロセスで execve システムコールを呼び出す。 メインの sudo プロセスは、コマンドが完了するまで wait し、完了したら、 コマンドの終了ステータスをセキュリティポリシーの close 関数に渡してから、 終了する。
Man page of SUDO
と子プロセスで(sudoなしのコマンドがroot権限で)実行されます。
このことはps
をツリー表示したらわかるんだと思います。
> sudo ps axf
.
.
.
11379 pts/1 S 0:07 \_ fish
21115 pts/1 S+ 0:00 \_ sudo ps axf
21116 pts/1 R+ 0:00 \_ ps axf
.
.
.
なので、子プロセスが自身のコマンドをリストに表示・検索対象にするかしないかに関わらず、
実行時点で親プロセスのsudo
が子プロセスのコマンドを抱えたままプロセスリストに載ってしまい、
場合によっては一つHIT数が増えてしまいます。
ps
,pgrep
はよく調べず既存のオプションを流用することがあるので(今回まともに調べた)、不要なオプションがあるかもしれないし、そうであるならば外した方が安全そうだ。sudo
含めて。
重複起動防止だけだとアドバイザリロックしたいんですが、
実行時間を見たり自殺したり他殺したり1ロックファイルと併用していたり他の特殊動作があったりそもそもチェック方法何種類も点在してたりとカオスなのでつらい。
参考
- PHPでバッチ処理するときの二重起動防止対応の手法をなるべく丁寧にまとめる - Qiita
- sudo - Wikipedia
- Man page of SUDO
- pgrep/pkillを使おう - Qiita
- 改めてsudoについて調べてみた - Qiita
-
less
でファイル見てたら殺された。と報告されたこともあった… ↩