5.6. ジョブコントロール -fg , bgコマンド-

Linuxは複数のプログラム(プロセス)を同時に動かすことができるマルチタスキングをサポートしています。しかし、端末(GUIであればGNOME端末等)で動かしている場合に、一つの端末で同時に一つのプロセスしか扱えないというのは不便です。そこで、ここではジョブコントロールという操作について紹介したいと思います。ジョブとは、1つ以上のプロセスが動いてひとまとまりの処理になっている場合の基本単位です。ジョブコントロールには2つの操作があります。

  • バックグラウンド実行 → 文字通りプロセスを背後で動かすことです。
  • フォアグラウンド実行 → プロセスを端末上に表示して実行することです。

【動画説明】
練習として、sleepコマンドを使ってその仕組みを見てみましょう。sleepコマンドは、指定した時間だけ待つというだけのコマンドです。単体で使用することはあまりなく、プログラムを実行する際に時間調整として用いることがほとんどです。たとえば、

$ sleep 10

$  ←10秒後にプロンプトが返る

といった動作をします。
ではまず、バックグラウンド実行を紹介します。この操作を行うには、コマンドの最後に”&”を追加するだけです。バックグラウンド実行すると即座にプロンプトが返ってきます。

$ sleep 10 &
[1] 5302 

この時に画面に表示されるのは、ジョブ番号(1)とプロセスID(5302)です。プロセスIDについては後述します。この場合、ジョブ番号1として動くことになったコマンドは、10秒後に終了するので、10秒以上経過した状態でプロンプトの書き換え(コマンドを実行してプロンプトが表示されるタイミング等)発生すると、通知が表示されます。
プロセスを終了する際はキー操作として“Ctrl+z”を入力します。この操作を行うと、実行中のプロセスが停止状態になります。

$ sleep 10
^Z
[1]+ 停止 sleep 10

【コマンド説明】

  • fg:foreground
    このコマンドは止めていたプロセスをフォアグラウンドで再開させます。フォアグラウンドで再開した場合は、そのプロセスを停止もしくは終了させるまでプロンプトは返ってきません。 
  • bg:background
    このコマンドは止めていたプロセスをバックグラウンドで再開させます。通常のコマンドに”&”を付けて実行するのと同じになります。
  • jobs
    実行中のジョブを表示します。 複数のプログラムを実行している場合や、どのプログラムが待機状態になっているか忘れてしまった時に使います。
【動画説明】

sleepコマンドで一度停止させたジョブをfgコマンドでフォアグラウンド実行してみましょう。

$ sleep 10
^Z
[1]+ 停止 sleep 10

$ fg
sleep 10

次に、停止しているジョブをバックグラウンドで再開させてみましょう。この場合、ジョブの指定は“%ジョブ番号”という記述になります。バックグラウンド動作中のプロセスは、一部の例外を除き、端末終了時に一緒に終了してしまうので、重要な作業をバックグラウンドで走らせている場合には注意して下さい。

$ vi /etc/issue ←^Zで停止

$ sleep 10
^Z
[1]+ 停止 sleep 10

$ jobs
[1]-   Stopped                 vim /etc/issue
[2]+  Stopped                 sleep 10

$ bg %2
[2]+ sleep 10 &

$ jobs
[1]+  Stopped                 vim /etc/issue
[2]+  Done                     sleep 10

【問題】
1. topコマンドをフォアグラウンドで実行し、一度停止させてから、再びバックグラウンドで実行してみましょう


資料をダウンロード