Linux fg コマンド
fgLinux/Unix システムにおいてプロセス制御に使用される重要なコマンドで、正式名称は "foreground"(フォアグラウンド)です。主な機能は、バックグラウンドで実行中のジョブ(job)をフォアグラウンドに切り替えて実行を継続することです。
なぜ fg コマンドが必要なのか
レストランで注文しているところを想像してください:
- メインディッシュを注文しました(フォアグラウンドプロセス)
- 同時にキッチンにデザートの準備を頼みました(バックグラウンドプロセス)
- メインディッシュを食べ終わったら、ウェイターにデザートを目の前まで運んでもらえます(fg コマンド)
Linux では、このフォアグラウンド/バックグラウンドのジョブ切り替えメカニズムにより、次のことが可能になります:
- 複数のタスクの実行順序を柔軟に制御できる
- 現在のタスクを一時的に中断して、より緊急の用事を処理できる
- ターミナルセッションを効率的に活用できる
基本構文
fg [作业标识]
パラメータの説明
| パラメータ | 説明 |
|---|---|
| パラメータなし | 最近バックグラウンドに移されたジョブを再開する |
| %n | ジョブ番号が n のジョブを再開する |
| %str | str で始まるジョブを再開する |
| %?str | str を含むジョブを再開する |
| %+ または %% | パラメータなしと同等で、最も最近のジョブを再開する |
| %- | バックグラウンドに移された2番目に新しいジョブを再開する |
使用例
例1: 基本的な使い方
長時間実行されるタスクを起動してバックグラウンドに移します:
sleep 60 & [1] 12345 # 系统返回作业号 [1] 和进程ID 12345
現在のジョブリストを確認します:
jobs [1]+ 运行中 sleep 60 &
ジョブをフォアグラウンドに戻します:
fg %1 # 或者简写为 fg
例2: 特定のジョブを再開する
例
# 複数のバックグラウンドジョブを起動する
python script1.py &
python script2.py &
# ジョブリストを確認する
jobs
[1]- 実行中 python script1.py&
[2]+ 実行中 python script2.py&
# 最初のジョブを再開する
fg %1
python script1.py &
python script2.py &
# ジョブリストを確認する
jobs
[1]- 実行中 python script1.py&
[2]+ 実行中 python script2.py&
# 最初のジョブを再開する
fg %1
動作原理
プロセス状態の遷移
例
graph LR
A[フォアグラウンド実行] -->|Ctrl+Z| B[一時停止状態]
B -->|fg| A
B -->|bg| C[バックグラウンド実行]
C -->|fg| A
A[フォアグラウンド実行] -->|Ctrl+Z| B[一時停止状態]
B -->|fg| A
B -->|bg| C[バックグラウンド実行]
C -->|fg| A
- フォアグラウンドプロセス:ターミナルを占有し、キーボード入力を受け取る
- バックグラウンドプロセス:ターミナルを占有せず、入力を受け取れない
- 一時停止プロセス:中断され、再開を待機している
シグナルメカニズム
次のコマンドfgを実行すると:
- システムはジョブに
SIGCONTシグナル(実行継続)を送信します - ジョブのプロセスグループをターミナルのフォアグラウンドプロセスグループに設定します
- ターミナルは入出力をそのプロセスにリダイレクトします
よくある質問(FAQ)
Q1: 現在のバックグラウンドジョブを確認するには?
次のコマンドjobsを使用して確認します:
例
jobs -l
出力例:
[1]- 12345 运行中 sleep 100 & [2]+ 12346 停止 vim file.txt
Q2: fg と bg の違いは何ですか?
| コマンド | 機能 | ターミナル制御 |
|---|---|---|
| fg | ジョブをフォアグラウンドに移動する | ターミナルを占有する |
| bg | 一時停止中のジョブをバックグラウンドで実行継続させる | ターミナルを占有しない |
Q3: fg 実行後、プログラムが入力を受け取れないのはなぜですか?
プログラムが一時停止されている(「停止済み」と表示される)可能性があります。まず継続シグナルを送信する必要があります:
例
kill -CONT <PID>
fg %1
fg %1
実際の使用シナリオ
シナリオ1: 開発・デバッグ
>開発サーバーを起動します:
例
python manage.py runserver
# Ctrl+Z で一時停止
[1]+ 停止済み python manage.py runserver
# Ctrl+Z で一時停止
[1]+ 停止済み python manage.py runserver
他のコマンドを一時的に実行する
サーバーを再開します:
例
fg
シナリオ2: ファイル編集
例
vim important_file.txt
# Ctrl+Z で編集を一時停止
# ファイルの内容を確認する
cat related_file.txt
# 編集に戻る
fg
# Ctrl+Z で編集を一時停止
# ファイルの内容を確認する
cat related_file.txt
# 編集に戻る
fg
注意事項
- ターミナルとの関連性:バックグラウンドジョブはそれを起動したターミナルに関連付けられており、ターミナルを閉じるとジョブは終了します
- 出力の干渉:バックグラウンドジョブの出力が突然フォアグラウンドに表示され、現在の作業を妨げる可能性があります
- 権限の制限:ターミナルとの対話が必要な一部のプログラム(パスワード入力など)はバックグラウンドで実行できません
- ジョブ番号の再利用:ジョブ番号はセッション内で一意ですが、異なるターミナルセッションでは独立してカウントされます
上級テクニック
nohup と組み合わせて使用する
ターミナルを終了してもジョブをバックグラウンドで永続的に実行させます:
例
nohup long_running_task &
# 後で再接続して再開できます
fg %1
# 後で再接続して再開できます
fg %1
disown を使用して関連付けを解除する
例
python server.py &
jobs -l # ジョブ番号を控える
disown %1 # ターミナルとの関連付けを解除する
# これでターミナルを安全に閉じられます
jobs -l # ジョブ番号を控える
disown %1 # ターミナルとの関連付けを解除する
# これでターミナルを安全に閉じられます