試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

シェル上のプロセスの動作状態(フォアグラウンド/バックグラウンド/サスペンド)とその制御について(前半)

動作状態

端末のシェルから起動されたプロセスには以下の動作状態がある。

  • フォアグラウンド(最前面で実行)
  • バックグラウンド(背後で実行)
  • サスペンド(一時停止)

以下、それぞれについて記述する。

フォアグラウンド

普通に起動されたプロセスはそのままそこで最前面(フォアグラウンド)のプロセスとして動作し、このプロセスを操作対象*1として、バックグラウンドもしくはサスペンドの状態へ移行させることが可能な他、Ctrl+Cで強制終了することもできる。*2
処理が終わるまではシェルの入力待ち状態にはならず、シェル上で次のコマンドの入力などの操作を行うことはできない。
GUIのアプリケーションをフォアグラウンドで起動すると、(内部的に無限ループしているために)そのアプリケーションを終了するまでの間、そのシェル上では操作が行えない。*3また、GUIのアプリケーションをサスペンドすると、ユーザインターフェースは無反応になる。*4

バックグラウンド

プロセスは背後で動かすことができ、その状態をバックグラウンド状態という。
バックグラウンド状態のプロセスが動作している間も、そのシェル上ではプロセスの動作を意識せずに別の操作(コマンドの入力など)が行える。

サスペンド

プロセスが一時停止した状態で、再開させるかバックグラウンド状態にするかができる。単純に「一時停止の後で解除を行う」という流れ以外に

  1. フォアグラウンドなプロセスをサスペンド
  2. 別のコマンドを実行
  3. サスペンドしていたプロセスをフォアグラウンドにする

という流れや

  1. フォアグラウンドなプロセスをサスペンド
  2. サスペンドしたプロセスをバックグラウンド動作に変更

といった流れでも使える。

ジョブとその一覧表示

シェル上のプロセスがバックグラウンドあるいはサスペンド状態になったときに、それを制御するために固有の番号(ジョブ番号)が割り当てられ、それぞれのプロセスは「ジョブ」として管理される。
シェルの組み込みコマンドjobsを用いるとジョブの一覧を表示でき、どちらの状態のプロセスもないときには

$ jobs
(何も出力されない)

このように何も表示されず、いずれかの状態のプロセスが存在する場合には

$ jobs
[1]-  Stopped                 gedit
[2]+  Stopped                 ghex2
[3]   Running                 gimp &
[4]   Running                 sylpheed &

のように一覧が表示され、サスペンド状態のプロセスには「Stopped」、バックグラウンド状態のプロセスには「Running」と表示される。
「+」の付いたジョブは後半で扱うfgbgといったコマンドを引数なしで実行したときに選択される。

(「シェル上のプロセスの動作状態(フォアグラウンド/バックグラウンド/サスペンド)とその制御について(後半)」に続く)

関連記事:

関連URL:

*1:キーボードの入力がプロセスに伝えられる

*2:逆に、フォアグラウンドでないプロセスはCtrl+C強制終了できない

*3:GUIのプログラムでなくても何かの操作などを待ち受ける形で動き続けるものは同様だが、そのプロセスが自身の複製を作って処理を続行させつつ自身は終了する処理(デーモン化/Daemonize)をするものはそこで見かけ上終了し、シェルから切り離されるため、シェルの操作(次のコマンド入力など)が行えるようになる

*4:プロセスの一時停止によりユーザ操作の処理やユーザインターフェースの描画処理ができなくなったため