言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理に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 を取得します。

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

sleep 20 &
pid2=$!
echo "sleep 20 の PID: $pid2"
bash bg_sample.sh
sleep 10 の PID: 12345
sleep 20 の PID: 12346

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

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

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

wait_all.sh
wait
echo "全ジョブ完了"
bash wait_all.sh
全ジョブ完了

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

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

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

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

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

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

概要

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

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

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

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