Linuxプロセス管理の実践 - ジョブコントロールとpkill・nice

Linuxプロセス管理の実践 - ジョブコントロールとpkill・nice

基礎編で学んだ「見る → 確認する → 止める」の判断の型を前提に、この実践編では次を学ぶ。

  • 止める以外の選択肢(バックグラウンド、nice)
  • 複数プロセスをまとめて操作(pkill、killall)
  • エラーへの対処(Operation not permitted など)

先に結論:実践の判断の型

プロセスが邪魔なとき、まず考える順番

プロセスが邪魔なとき、いきなり kill に手を伸ばす前に次の順番で考えると良い。

  1. バックグラウンドに逃がせないか?(端末を使いたいだけなら)
  2. 優先度を下げられないか?(CPUが重いだけなら)
  3. 止める必要があるなら、まずTERMから

「止める」は選択肢の一つに過ぎない。

止めずに逃がす:バックグラウンド実行

最初からバックグラウンドで起動

$ long_command &

コマンドの最後に & を付けると、バックグラウンドで実行される。

SSH切断後も継続させたい場合

$ nohup long_command &

nohup を付けると、ログアウト後もプロセスが継続する。標準出力は自動的に nohup.out に書き込まれる。出力先を明示したい場合は次のように指定する。

$ nohup long_command > output.log 2>&1 &

ジョブコントロール:Ctrl+Z / bg / fg

「実行中のコマンドを一旦止めて、端末を使いたい」という場面で使う。

基本の流れ

# 1. 実行中のコマンドを一時停止
Ctrl+Z

# 2. バックグラウンドで再開
$ bg

# 3. または、フォアグラウンドに戻す
$ fg

複数ジョブがある場合

# ジョブ一覧を確認
$ jobs
[1]-  Stopped     vim file.txt
[2]+  Running     ./script.sh &

# ジョブ番号を指定して操作
$ fg %1    # vim をフォアグラウンドに

判断ポイント

  • Ctrl+Z = 一時停止(プロセスは生きている)
  • Ctrl+C = 終了を試みる(SIGINT送信)

「端末を取り戻したい」だけなら Ctrl+Z → bg で止めずに済む。

複数プロセス操作:pkill / killall

同じ名前のプロセスが複数ある場合、PIDを一つずつ指定するのは大変だ。

pkill:名前でまとめて操作

# python という名前のプロセスすべてに SIGTERM
$ pkill python

# 強制終了(最終手段)
$ pkill -9 python

killall:同様に名前で操作

$ killall python

注意:名前の一致範囲

  • pkill:部分一致(python → python3 も対象)
  • killall:完全一致

意図しないプロセスを止めないよう、事前に pgrep で確認することを推奨する。

# 対象を事前確認
$ pgrep -l python
1234 python3
5678 python

止めずに落ち着かせる:nice / renice

CPUが重いプロセスを「止める」のではなく、優先度を下げて他の処理を優先させる選択肢だ。

nice:起動時に優先度を指定

# 低優先度で実行(数値が大きいほど低優先度)
$ nice -n 10 ./heavy_script.sh

renice:実行中のプロセスの優先度を変更

# PID 1234 の優先度を下げる
$ renice +10 -p 1234

nice値の範囲

意味
-20 最高優先度(root権限必要)
0 デフォルト
+19 最低優先度

数値が小さいほど優先度が高いという点に注意。

nice/renice が有効な場面:

  • バックアップスクリプトを裏で実行中、他の作業を優先したい
  • ビルド処理が重いが、止めたくない
  • 夜間バッチの優先度を最初から低くしておきたい

止めるとやり直しになる処理では、優先度変更が有効だ。

エラー対処:Operation not permitted

killやpkillで「Operation not permitted」が出る場合の対処。

原因と対策

$ kill 1234
bash: kill: (1234) - Operation not permitted

このエラーが出る主な原因

  1. 他のユーザーのプロセスを止めようとしている
  2. システムプロセス(rootが起動)を止めようとしている

対処法

# まず、プロセスの所有者を確認
$ ps aux | grep 1234

# 自分のプロセスでなければ sudo が必要
$ sudo kill 1234

sudo を使う前に

root権限で止めるということは、システムに影響を与える可能性があるということだ。「なぜ自分のプロセスじゃないのか」を確認してから実行すること。

実務シナリオ:よくある場面と対応

シナリオ1:vimを開いたまま端末を使いたい

Ctrl+Z       # vim を一時停止
$ bg         # バックグラウンドへ(vim は停止状態のまま)
$ fg         # 作業後、vim に戻る

シナリオ2:pythonプロセスが複数暴走

# 1. 対象を確認
$ pgrep -l python
1234 python3
5678 python3

# 2. まとめて SIGTERM
$ pkill python

# 3. 数秒待ってから確認し、残っていれば強制終了
$ pgrep python && pkill -9 python

pkill -9 は即座にプロセスを強制終了し、データ保存・クリーンアップ処理を行う機会を与えない。SIGTERM(デフォルト)を送った後は数秒待ち、プロセスが残っている場合にのみ使用すること。

シナリオ3:ビルドが重いが止めたくない

# ビルドプロセスのPIDを確認
$ pgrep -l make
1234 make

# 優先度を下げる
$ renice +15 -p 1234

シナリオ4:SSH切断後も実行を続けたい

# 最初から nohup で起動
$ nohup ./long_script.sh > log.txt 2>&1 &

# または、実行中のジョブを切り離す
$ disown %1

まとめ

プロセスが邪魔なとき

  1. 端末を使いたいだけ → Ctrl+Z → bg
  2. CPUが重いだけ → renice で優先度を下げる
  3. 止める必要がある → kill(SIGTERM)
  4. それでも止まらない → kill -9(最終手段)

「止める」は最後の選択肢だ。

次に読む