kazmax - Linux で自宅サーバー

実行中のプログラムをバックグラウンドにもっていく。フォアグラウンドにもってくる(bg、fg)

linuxでは、実行中のプログラムをバックグラウンドにもっていったり、フォアグラウンドにもってきたりと、ジョブの状態を切り替えることができます。ここでは、bg、fg コマンドの使い方と、プロセスの停止方法、ジョブの参照方法について説明します。

Last Update : 2014年03月12日

実行中のプログラムをバックグラウンドにもっていく。フォアグラウンドにもってくる(bg、fg)項目

  1. プロセスを停止させる。
  2. ジョブをバックグラウンドで実行する。(bg)
  3. ジョブをフォアグラウンドで実行する。(fg)
  4. ジョブの参照方法はいろいろある。

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

と同じ意味になります。

プロセス管理 関連記事
Linux 基礎知識 関連記事