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

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

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

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

プロセスをバックグラウンド状態で起動する

シェルからのプロセスの起動(コマンドの実行)において、コマンド行の最後に「&」を付けると、それが起動後バックグラウンドで動作する。
GUIのアプリケーションなどを端末から起動する場合などによく用いられる。

$ gedit &
[1] 12345

このとき、上のようにジョブ番号が角括弧で囲まれ、その右にプロセスIDが表示される。

バックグラウンド/サスペンド状態のジョブの終了の通知について

バックグラウンド/サスペンド状態のジョブが終了した場合、シェルに通知される。
bashでは次にEnterを押したとき、zshでは即座に

[1]+  Done                    gedit

のような形式で表示がされる。bashでも以下の設定により即座に通知を行うことが可能。
ファイル名: ~/.bashrc

set -o notify

zshで即座に通知しないようにするには以下の設定を行う。
ファイル名: ${ZDOTDIR}/.zshrc

setopt no_NOTIFY

ジョブの制御

フォアグラウンドのジョブをサスペンド状態にする

フォアグラウンドのジョブをサスペンド状態にするには、プロセスの実行中にCtrl+Zを押す。

$ gedit
(動作中にCtrl+Zを押す)
[1]+  Stopped                 gedit
(サスペンド状態になる)
サスペンド/バックグラウンド状態のジョブをフォアグラウンドにする

サスペンド状態のジョブをフォアグラウンドで実行させたいときにはシェル組み込みコマンドfgを用い、フォアグラウンドにしたいジョブのジョブ番号を指定する。

(ジョブ一覧を確認)
$ jobs
[1]-  Stopped                 gedit
[2]+  Stopped                 ghex2
(「fg」で実行すると2番が選択される・ここでは1番を選択することにする)
$ fg 1
gedit
(geditがフォアグラウンドで実行される)

「+」の付いているジョブをフォアグラウンドにしたい場合、引数は省略できる。

(ジョブ一覧を確認)
$ jobs
[1]+  Stopped                 gedit
(「+」付きのジョブをフォアグラウンドにする)
$ fg
gedit
(フォアグラウンドで実行される)

バックグラウンドのジョブをフォアグラウンドにする場合も同様。
なお、別の(仮想)端末上で起動してバックグラウンド動作させたプロセスなど、現在のシェル上でjobsコマンドを引数なしで実行しても出てこないものをフォアグラウンド状態とすることはできない。これはそのシェルから見た子プロセスではないためで、こういったプロセスの制御には(広い意味での)UNIX系OSの「シグナル」という通知を用いるが、ここでは扱わない。

サスペンド/フォアグラウンド状態のジョブをバックグラウンドにする

サスペンド状態のジョブをバックグラウンドにするには「サスペンド/バックグラウンド状態のジョブをフォアグラウンドにする」と同じ要領でシェル組み込みコマンドbgを用いる。
「+」の付いていないジョブをバックグラウンドにしたい場合は引数が必要で

(ジョブ一覧を確認)
$ jobs
[1]-  Stopped                 gedit
[2]+  Stopped                 ghex2
(1番のジョブをバックグラウンドにする)
$ bg 1
[1]- gedit &

「+」の付いているジョブをバックグラウンドにしたい場合は引数省略可となる。

(ジョブ一覧を確認)
$ jobs
[1]+  Stopped                 gedit
(「+」付きのジョブをバックグラウンドにする)
$ bg
[1]+ gedit &

フォアグラウンドのジョブをバックグラウンドにするには、一度Ctrl+Zを押してサスペンド状態にしてからbgコマンドを引数なしで実行する。

$ gedit
(動作中にCtrl+Zを押す)
[1]+  Stopped                 gedit
(サスペンド状態になる)
$ bg
(バックグラウンド状態になる)
[1]+ gedit &

関連記事: