5.2 ジョブ制御
Job Control
シェルはジョブ(コマンドの実行単位)をフォアグラウンドとバックグラウンドで管理する。
フォアグラウンドとバックグラウンド
@startuml !theme plain skinparam backgroundColor #FEFEFE state "フォアグラウンド\n(実行中)" as FG #DBEAFE state "バックグラウンド\n(実行中)" as BG #D1FAE5 state "停止\n(Stopped)" as Stop #FEF3C7 state "終了" as End #E5E7EB [*] --> FG : command [*] --> BG : command & FG --> Stop : Ctrl+Z FG --> End : 完了/Ctrl+C Stop --> FG : fg Stop --> BG : bg BG --> Stop : kill -STOP BG --> End : 完了 @enduml
図1: ジョブの状態遷移
| 状態 | 説明 |
|---|---|
| フォアグラウンド | 端末を占有、入力を受け付ける |
| バックグラウンド | 裏で実行、端末は解放 |
| 停止(Stopped) | 一時停止、再開可能 |
基本操作
# バックグラウンドで起動
./long_task.sh &
# ジョブ一覧
jobs
jobs -l # PID付き
# フォアグラウンドへ
fg %1 # ジョブ番号1を前面に
fg # 最新のジョブを前面に
# バックグラウンドへ(停止中のジョブを再開)
bg %1
# 実行中のジョブを停止
# Ctrl+Z(フォアグラウンド実行中に)
# ジョブの終了
kill %1
nohup / disown
# ログアウト後も継続(SIGHUP無視)
nohup ./script.sh &
nohup ./script.sh > output.log 2>&1 &
# 既存ジョブをシェルから切り離す
./script.sh &
disown %1
# 全バックグラウンドジョブを切り離す
disown -a
nohup vs disown
nohupは起動時に指定、disownは実行中のジョブに対して適用。どちらもログアウト後の継続に使用。
実践例
# 長時間処理をバックグラウンドで
$ nohup ./backup.sh > backup.log 2>&1 &
[1] 12345
# 進行確認
$ tail -f backup.log
# フォアグラウンド実行 → 停止 → バックグラウンド
$ ./process.sh
^Z
[1]+ Stopped ./process.sh
$ bg
[1]+ ./process.sh &
# ジョブ確認
$ jobs
[1]+ Running ./process.sh &
出典
[1] Bash Reference Manual - Job Control.
[2] man nohup - run a command immune to hangups.
[2] man nohup - run a command immune to hangups.