Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. Bash辞典
  3. &(バックグラウンド実行)

&(バックグラウンド実行)

コマンドの末尾に『&』を付けるとバックグラウンドで実行されます。フォアグラウンドに戻すには『fg』、一時停止中のジョブをバックグラウンドに送るには『bg』を使います。端末を閉じてもプロセスを継続するには『nohup』か『disown』を使います。

構文
# バックグラウンドで実行
コマンド &

# ジョブ一覧の表示
jobs
jobs -l   # PID も表示

# フォアグラウンドに戻す
fg
fg %ジョブ番号

# バックグラウンドで再開(Ctrl+Z で停止したジョブを)
bg
bg %ジョブ番号

# 端末を閉じてもプロセスを継続(nohup)
nohup コマンド &
nohup コマンド > ログファイル 2>&1 &

# ジョブをシェルの管理から切り離す
disown %ジョブ番号
disown -a   # 全ジョブを切り離す
コマンド一覧
コマンド概要
コマンド &コマンドをバックグラウンドで起動します。$! に PID が入ります。
jobs現在のシェルのバックグラウンドジョブ一覧を表示します。
jobs -lジョブ番号・PID・状態・コマンドを表示します。
fg [%N]ジョブ番号 N のジョブをフォアグラウンドに戻します。
bg [%N]停止中のジョブ N をバックグラウンドで再開します。
Ctrl+Zフォアグラウンドのプロセスを一時停止します(SIGSTOP)。
Ctrl+Cフォアグラウンドのプロセスを終了します(SIGINT)。
nohup コマンド &端末を閉じても SIGHUP を無視してプロセスを継続します。
disown %Nシェルのジョブ管理からプロセスを切り離します。
wait [PID]指定したバックグラウンドプロセスの終了を待ちます。
サンプルコード

コマンドの末尾に『&』を付けてバックグラウンドで実行し、『$!』で PID を取得します。

sleep 10 &
pid1=$!
echo "sleep 10 の PID: $pid1"

sleep 20 &
pid2=$!
echo "sleep 20 の PID: $pid2"
sleep 10 の PID: 12345
sleep 20 の PID: 12346

『jobs -l』でバックグラウンドジョブの一覧を確認します。

jobs -l
[1]  12345 Running    sleep 10 &
[2]  12346 Running    sleep 20 &

『wait』で全バックグラウンドジョブの完了を待ちます。

wait
echo "全ジョブ完了"
全ジョブ完了

独立したタスクをバックグラウンドで同時実行する並列処理の例です。完了順は実行時間に依存します。

process() {
    local name="$1"
    local secs="$2"
    sleep "$secs"
    echo "$name 完了(${secs}秒)"
}

process "タスクA" 3 &
process "タスクB" 1 &
process "タスクC" 2 &
wait
タスクB 完了(1秒)
タスクC 完了(2秒)
タスクA 完了(3秒)

特定の PID だけを待つこともできます。メインの処理と並行して重い処理を走らせる場合に便利です。

long_task() {
    sleep 2
    echo "タスク完了"
}

long_task &
task_pid=$!
echo "バックグラウンドで実行中... (PID: $task_pid)"
echo "メインスレッドで作業中..."
wait $task_pid
echo "タスクが終わりました(終了ステータス: $?)"
バックグラウンドで実行中... (PID: 12347)
メインスレッドで作業中...
タスク完了
タスクが終わりました(終了ステータス: 0)
概要

バックグラウンドジョブは親シェルが終了すると SIGHUP を受信して終了します。端末を閉じてもプロセスを継続したい場合は nohup コマンド > out.log 2>&1 & を使います。nohup のデフォルト出力先は nohup.out です。

複数のバックグラウンドジョブを並列実行してから全て待つパターン(wait)は並列処理に有効です。ただしシェルスクリプトの並列処理はエラーハンドリングが複雑になるので、大規模な並列処理には専用ツールを使うことを推奨します。

プロセスの停止・シグナル送信は kill / pkill / killall を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。