Linuxプロセス管理の実践 - ジョブコントロールとpkill・nice
基礎編で学んだ「見る → 確認する → 止める」の判断の型を前提に、この実践編では次を学ぶ。
- 止める以外の選択肢(バックグラウンド、nice)
- 複数プロセスをまとめて操作(pkill、killall)
- エラーへの対処(Operation not permitted など)
先に結論:実践の判断の型
プロセスが邪魔なとき、まず考える順番
プロセスが邪魔なとき、いきなり kill に手を伸ばす前に次の順番で考えると良い。
- バックグラウンドに逃がせないか?(端末を使いたいだけなら)
- 優先度を下げられないか?(CPUが重いだけなら)
- 止める必要があるなら、まず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
このエラーが出る主な原因
- 他のユーザーのプロセスを止めようとしている
- システムプロセス(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
まとめ
プロセスが邪魔なとき
- 端末を使いたいだけ → Ctrl+Z → bg
- CPUが重いだけ → renice で優先度を下げる
- 止める必要がある → kill(SIGTERM)
- それでも止まらない → kill -9(最終手段)
「止める」は最後の選択肢だ。