危険察知4 択難易度 標準

状況

本番で固まった 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

正答

  1. 3301 は master の PID。worker は 3318 で、このままではサービス全体が止まる
  2. いきなり -9 ではなく、まず -15(TERM)を送って worker に終了処理の機会を与えるべき
  3. ps -C ではなく pgrep を使わないと、表示と実行の間に PID がずれることがある
  4. kill に sudo は不要。自分で起動していないプロセスでも、同じ権限で止められる

解説

作業者は worker 行の PPID 列にある 3301、つまり親の master を指定している。master に SIGKILL を送ると後始末をせずに即座に終了し、worker も親を失って終了するので、固まった 1 つではなくアプリ全体が止まる。止めるべきは 3318。-9 より先に -15 を送るべきという指摘は正しい作法だが、対象の PID を間違えていることに比べれば優先度は低い。他のユーザーのプロセスを止めるには root 権限が要るので 4 番目は誤り。

参考: man7.org

bashkillprocess

この問題を含む 危険察知 のテストを制限時間つきで解く

危険察知クイズへ