実行中のプログラムをバックグラウンドにもっていく。フォアグラウンドにもってくる(bg、fg)
linuxでは、実行中のプログラムをバックグラウンドにもっていったり、フォアグラウンドにもってきたりと、ジョブの状態を切り替えることができます。ここでは、bg、fg コマンドの使い方と、プロセスの停止方法、ジョブの参照方法について説明します。
Last Update : 2014年03月12日
実行中のプログラムをバックグラウンドにもっていく。フォアグラウンドにもってくる(bg、fg)項目
1. プロセスを停止させる。
プロセスを停止させるとbashに制御がうつり、ユーザはジョブの状態を操作できるようになります。
ジョブを停止させるには、キーボードで「Ctrl + z」と入力します。
# sleep 60 ^Z ← 「Ctrl + z」と入力 [1]+ 停止 sleep 60 ← ジョブが停止する
この状態になると、bashに制御がうつり、ユーザはこのジョブの状態を操作できるようになります。
バックグラウンドでジョブの実行を継続する場合は bg コマンドを使い、フォアグラウンドで実行を継続する場合は fg コマンドを使います。プロセスを終了する場合は kill コマンドで終了させます。
memo
バックグラウンドジョブを停止するにはジョブにSTOPシグナルを送ります。
# jobs [1]+ 実行中 sleep 60 & ← ジョブ番号1番 # kill -SIGSTOP %1 ← ジョブ番号を指定してシグナルを送ることができます。(ジョブ番号とは) # jobs [1]+ 停止 sleep 60 ← ジョブが停止する
memo
ジョブを停止中にexitしようとすると、Bashは警告メッセージで停止中のジョブがあることを教えてくれます。
# sleep 60
^Z
[1]+ 停止 sleep 60
# exit
logout
There are stopped jobs.← 警告メッセージ
※ 他のコマンドを実行しないでそのまま再度exitしようとすると、警告無しで、ジョブも終了させてexitできます。
2. ジョブをバックグラウンドで実行する。(bg)
ジョブを「Ctrl + z」で停止すると、バックグラウンドで処理が停止しています。バックグラウンドで処理を再開させるには、「bg」コマンドを使います。
bg 書式
bg %ジョブ番号
%+数字でジョブ番号を指定します。
※ ジョブ番号を省略すると、カレントジョブを指定したことになります。
memo
ジョブ番号は、「jobs」コマンドで確認できます。[]で囲まれた中の数字がジョブ番号です。
# jobs [1]+ 停止 sleep 60 ← ジョブ番号1 [2] 実行中 sleep 60 & ← ジョブ番号2 [3] 実行中 sleep 60 & ← ジョブ番号3 [4]- 実行中 sleep 60 & ← ジョブ番号4
memo
カレントジョブについて
カレントジョブとは、バックグラウンドで起動された最後のジョブか、最後に停止したフォアグラウンドジョブのことです。
「jobs」コマンドを使うとカレントジョブには + というフラグが付き、前のジョブには - がつきます。
# jobs [1] 実行中 sleep 50 & [2] 実行中 sleep 60 & [3]- 実行中 sleep 70 & ← 1個前のジョブ [4]+ 実行中 sleep 80 & ← カレントジョブ
bg 実行例
# sleep 60 ^Z ← 「Ctrl + z」でジョブを停止する [1]+ 停止 sleep 60 ← ジョブが停止 # jobs [1]+ 停止 sleep 60 ← ジョブ番号は1 # bg %1 ← バックグラウンドで処理再開 [1]+ sleep 60 & # jobs [1]+ 実行中 sleep 60 & ← 実行中になる
3. ジョブをフォアグラウンドで実行する。(fg)
フォアグラウンドでジョブの実行を継続する実行させるには、「fg」コマンドを使います。
fg 書式
fg %ジョブ番号
※ ジョブ番号を省略すると、カレントジョブを指定したことになります。
fg 実行例
# sleep 60 ^Z [1]+ 停止 sleep 60 # jobs [1]+ 停止 sleep 60 ← ジョブ番号は1 # fg %1 ← フォアグラウンドで処理再開 sleep 60 ← ジョブがフォアグラウンドにくる
4. ジョブの参照方法はいろいろある。
ジョブの参照方法はいろいろあります。基本的には、「%」という記号がジョブを表します。
% + 数字 | %1, %2のようにジョブ番号で参照できます。 |
%%,%+ | カレントジョブを参照する。 |
%- | 前のジョブ |
% + 文字 | %ps, %sleep 等のようにコマンドライン中の文字列を指定して参照できます。※先頭の部分がマッチするジョブが複数ある場合には、エラーとなります。 |
ジョブの参照例
# jobs [1] 実行中 sleep 50 & [2] 実行中 sleep 60 & [3]- 実行中 sleep 70 & [4]+ 実行中 sleep 80 & # fg %% ← カレントジョブを指定 sleep 80 # fg %- ← 一個前のジョブを指定 sleep 70
# jobs [1]- 実行中 sleep 60 & [2]+ 停止 ps -ef | less # fg %ps ← 文字列でジョブを指定 ps -ef | less ← 指定した「ps」という文字列ではじまるジョブがフォアグラウンドにくる UID PID PPID C STIME TTY TIME CMD root 1 0 0 Feb18 ? 00:00:00 /sbin/init root 2 0 0 Feb18 ? 00:00:00 [kthreadd] root 3 2 0 Feb18 ? 00:00:00 [migration/0] root 4 2 0 Feb18 ? 00:00:01 [ksoftirqd/0] root 5 2 0 Feb18 ? 00:00:00 [migration/0]
こんなジョブの呼び方もあります
%+数字や、%+文字列と入力するだけで、単にジョブを呼ぶことができ、呼ばれたジョブはフォアグラウンドに持ってこられます。
# jobs
[1] 実行中 sleep 50 &
[2] 実行中 sleep 60 &
[3]- 実行中 sleep 70 &
[4]+ 実行中 sleep 80 &
# %1 %+数字でジョブがフォアグラウンドに持ってこられる
sleep 50
これは、
# fg %1
を実行したのと同じ意味になります。
同じように
# %1 &
は、
# bg %1
と同じ意味になります。