状況
本番で固まった worker プロセスを 1 つだけ止めたい。作業者が ps で確認してから kill を打った。
Enter の前に止めるべき点は?
$ ps -o pid,ppid,cmd -C gunicorn PID PPID CMD 3301 1 gunicorn: master [app] 3318 3301 gunicorn: worker [app]$ sudo kill -9 3301正答
- 3301 は master の PID。worker は 3318 で、このままではサービス全体が止まる
- いきなり -9 ではなく、まず -15(TERM)を送って worker に終了処理の機会を与えるべき
ps -Cではなく pgrep を使わないと、表示と実行の間に PID がずれることがある- kill に sudo は不要。自分で起動していないプロセスでも、同じ権限で止められる
解説
作業者は worker 行の PPID 列にある 3301、つまり親の master を指定している。master に SIGKILL を送ると後始末をせずに即座に終了し、worker も親を失って終了するので、固まった 1 つではなくアプリ全体が止まる。止めるべきは 3318。-9 より先に -15 を送るべきという指摘は正しい作法だが、対象の PID を間違えていることに比べれば優先度は低い。他のユーザーのプロセスを止めるには root 権限が要るので 4 番目は誤り。
参考: man7.org
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ