5.2 ジョブ制御

Job Control

シェルはジョブ(コマンドの実行単位)をフォアグラウンドとバックグラウンドで管理する。

フォアグラウンドとバックグラウンド

ジョブ状態遷移

図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.