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

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

コマンドをフォアグラウンドとバックグラウンドで実行する方法を、実際に操作しながら理解します。本レッスンでは、フォアグラウンドとバックグラウンド の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

ターミナルでコマンドを実行すると、結果が出るまで他の操作ができなくなることがあります。これはコマンドが「フォアグラウンド」で動いているからで、シェルがそのプロセスに端末の制御を渡している状態です。長時間のビルドやログの追跡、サーバーの起動などは、別のことを並行したいので「バックグラウンド」で動かす技を知っておくと作業効率が大きく変わります。

本レッスンでは、ジョブ制御という仕組みを使って同じシェルから複数のプロセスを管理する方法を整理します。& でバックグラウンド起動、Ctrl+Z で一時停止、jobs で一覧、fg で前面復帰、bg で背面再開という流れを覚えると、開発機での操作がぐっと滑らかになります。

ジョブとプロセスの違い

「プロセス」は OS 全体の概念で PID が一意でしたが、「ジョブ」はそのシェルの中だけで通用するローカルな番号です。%1, %2 のように % プレフィックスで指定し、シェルを抜けると消えます。

区分識別子スコープ
プロセスPID (数字)OS 全体
ジョブ%N (数字)そのシェル内

基本構文

ターミナル

コマンド & # バックグラウンドで起動 Ctrl+Z # フォアグラウンドのジョブを一時停止 bg %1 # 一時停止中のジョブをバックグラウンドで再開 fg %1 # バックグラウンドのジョブをフォアグラウンドに戻す jobs # 現在のシェルが持っているジョブ一覧
コマンド役割
&コマンドの末尾に付けてバックグラウンド起動
jobsジョブ一覧 (-l で PID も表示)
fg %Nジョブ N をフォアグラウンドに戻す
bg %Nジョブ N をバックグラウンドで再開
disown %Nシェルから切り離して保護する
wait %Nジョブの終了を待つ

ジョブの状態遷移

diagram (will load when visible)

フォアグラウンドで動いているコマンドを Ctrl+Z で一時停止し、bg で背面に逃がしてからプロンプトに戻る、という流れが定番です。逆にバックグラウンドのジョブで対話入力が必要になったら fg で前面に戻します。

代表例

バックグラウンドで起動

ターミナル

$ sleep 60 & [1] 12345 $ jobs [1]+ Running sleep 60 &

[1] がジョブ番号、12345 が PID です。jobs で一覧でき、jobs -l を使えば PID も付きます。

一時停止からの再開

ターミナル

$ sleep 60 ^Z [1]+ Stopped sleep 60 $ bg %1 [1]+ sleep 60 & $ fg %1 sleep 60

Ctrl+Z で一時停止し、bg で背面で再開、fg で前面に戻すサイクルです。Vim や less のように対話処理を持つツールを一時的に避ける場面で多用します。

バックグラウンドの落とし穴

単に & で逃がしただけだと、シェルを閉じたときに SIGHUP がジョブにも届いてプロセスが死ぬことがあります。これを避けるのが次のレッスンで扱う nohupdisown です。

ターミナル

nohup long_job.sh & # HUP を無視して残す long_job.sh & disown %1 # シェルから切り離す

SSH 接続が切れた後も実行を続けたいなら、& だけでは不十分です。nohup, disown, tmux などのどれかと組み合わせるのが定石です。次のレッスンで詳しく扱います。

標準出力の扱い

バックグラウンドのプロセスが標準出力に書き込み続けると、プロンプトに混ざって見づらくなります。リダイレクトで切り離しておくのが定番です。

ターミナル

long_job.sh > job.log 2>&1 & tail -f job.log

> job.log 2>&1 で標準出力と標準エラーをまとめてファイルに流し、必要なときだけ tail -f で覗きます。

出力の確認とサンドボックス

Cloud Functions サンドボックスでは tty (端末) が存在しないため、Ctrl+Z や fg を実際に操作することはできません。ただし & でバックグラウンド起動、jobs で一覧、wait で待つ流れは動きます。本レッスンの演習ではこの範囲を確認します。

ターミナル

sleep 1 & sleep 2 & jobs wait echo all done

ノートパソコンの開発機で実演する場合は、ぜひ実際に Ctrl+Z や fg %1 を試して体感を掴んでください。サンドボックスではログとして残る部分だけ確認します。

まとめ

  • 末尾の & でコマンドをバックグラウンド起動する
  • Ctrl+Z はフォアグラウンドのジョブを停止状態にする
  • bg %N, fg %N, jobs でジョブを行き来する
  • 標準出力はリダイレクトしてログファイルに逃がすと作業しやすい
  • SSH 切断後も残したい場合は次のレッスンの nohupdisown を使う

次のレッスン

次は nohupでログアウト後も実行する で、nohup を使ってログアウト後もコマンドを実行し続ける方法を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. fg/bg ジョブ の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. fg/bg ジョブ とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. sleep をバックグラウンドで 2 つ起動する
  2. wait で全ての完了を待つ

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力