ここから本文です

Linuxの「ジョブコントロール」をマスターしよう

7/24(月) 7:55配信

@IT

●フォアグラウンドジョブとバックグラウンドジョブ

 Linuxでは、シェルが表示するコマンドプロンプトでコマンドを入力して[Enter]キーを押すと、そのコマンドが実行されます。シェルはこれを「ジョブ」として管理しています。例えば、「ls」コマンドを実行した場合は、lsのプロセス1つが1つのジョブ、「ls | more」ならばlsとmore、2つのプロセスで1つのジョブです。

システムモニターをフォアグラウンドで実行

 コマンド名を入力して[Enter]キーを押した場合、そのジョブは「フォアグラウンドジョブ(foreground job)」として実行されます。フォアグラウンドジョブが終わるとシェルは再びプロンプトを表示し、次のコマンドを入力できる状態になります。

 これに対し、コマンドラインの最後に「&」を入力して実行すると、そのジョブは「バックグラウンドジョブ(background job)」として実行され、すぐに次のコマンドが入力できるようになります。

○コマンドラインでバックグラウンドジョブを動かす場面

 コマンドラインで“1つの端末しか使えない環境で、時間がかかる処理をしたい”場合にバックグラウンドジョブが役に立ちます。

 ただし、バックグラウンドで動作しているジョブからの出力が「標準出力」や「標準エラー出力」になっていると、次のコマンドを入力、実行する際にメッセージが混ざってしまいます。

 そこで、コマンドラインからの出力が混ざってしまわないように、バックグラウンドで実行するコマンドはメッセージをリダイレクトしておきます。

 以下のコマンド例では、「find」コマンドでルート以下の「*.log」というファイルを探しています。実行結果をデスクトップの「found.log」に、エラーメッセージは破棄(NULLデバイスへリダイレクト)しています。

□□
find / -name *.log > Desktop/found.log 2>/dev/null &
□□

 findコマンドを実行すると、終了を待たずにすぐに次のプロンプトが表示されます。

 ここで「jobs」コマンドを実行すると、「[1]」というジョブが動いていることが分かります。

 バックグラウンドジョブが終了すると“次のコマンドを実行したとき”に、その旨が表示されます。次の実行画面では、findコマンドで出力した「found.log」の行数(=見つかったファイルの件数)を、「wc」コマンドでカウントしています。

○「コマンド ; コマンド」と「コマンド & コマンド」の違い

 “端末で実行したい時間がかかる処理”というと、代表的な処理に「コンパイル」があります。

 典型的な操作コマンドが「./configure; make」になります(※)。これは、「実行中の環境に合わせたコンパイル用の設定ファイルを作成する」と「コンパイルおよび実行ファイルを作成する」という作業をしています。

□□
【※】この後に「make install」を実行するのが一般的ですが、通常はインストールする際にroot権限が必要なので「./configure; make; sudo make install」とします。
□□

 この場合は「configureを実行して、それが完了したらmakeを実行する」という順番で作業しなくてはならないので、「&」ではなく「;」を使うことになります。これは、「;」の位置で[Enter]キーを押しているのと同じ動作です。

○「コマンド && コマンド」と「コマンド & コマンド」の違い

 先の「./configure; make」では、「;」ではなく「&&」を使うケースもあります。

 「A && B」は「AかつB」を表し、シェルスクリプトの条件文などでよく使われます。この場合は、Aの実行結果がTRUEのときだけBを実行してTRUEかどうかを試す、という動作になります。

 従って、コマンドラインで「./configure && make」と実行した場合は、「configureを実行して、それが成功したらmakeを実行する」という内容になります。

●バックグラウンドジョブに切り替えるには?

 バックグラウンドジョブに対し、端末の“表”で実行するコマンドがフォアグラウンドジョブです。

 端末でキーボードを入力すると、フォアグラウンドジョブがその入力を受け取ります。ここで[CTRL]+[Z]キーを入力すると、フォアグラウンドジョブを停止させることができます。

 停止させたジョブは、「bg」コマンドでバックグラウンド再開、「fg」コマンドでフォアグラウンド再開させることができます。

○bgコマンドとfgコマンドを試してみよう

 動作を確認しやすいように、今回もX(X Window System)環境を使用して試してみましょう。

 まず、「gnome-system-monitor」で「システムモニター」を起動します。

□□
gnome-system-monitor
□□

 「&」を付けないで実行したため、システムモニター(gnome-system-monitor)はフォアグラウンドで動作中です。プロンプトは表示されていません。

 システムモニターを実行したターミナルで、[CTRL]+[Z]キーを入力してみましょう。すると、システムモニターは停止します。

 ターミナルでbgコマンドを実行すると、停止していたシステムモニターが再開します。バックグラウンドで再開しているため、プロンプトも表示されています。

 jobsコマンドを実行すると、ジョブ番号[1]でシステムモニター(gnome-system-monitor)が実行中である旨が表示されます。

 次に、fgコマンドを実行すると、バックグラウンドで動作しているシステムモニターがフォアグラウンドジョブに切り替わります。ここで[CTRL]+[C]キーを入力すると、フォアグラウンドで動作しているシステムモニターが終了します。

○コマンドラインでの活用

 コマンドラインで実行するコマンドも、[CTRL]+[Z]キーで停止、bgまたはfgコマンドで再開することができます。

 ただし、「man」コマンドや「less」コマンド、あるいは「vi(ターミナルで動作するエディタ)」のように、“画面の使用が前提”となっているコマンドの場合は停止のみで、再開させることはできません。

 以下は「man bash」でbashのマニュアルを表示している画面です。ここで[CTRL]+[Z]キーを入力します。

 manが停止してプロンプトが表示されるので、続いて「less /etc/bashrc」でbashの設定ファイルを表示してみましょう。

 ここで[CTRL]+[Z]キーを入力すると、再びプロンプトが表示されます。jobsコマンドを実行すると、2つのジョブが実行中であることが分かります。

 プロンプトで「fg %1」または「fg 1」を実行すると、ジョブ番号[1]で実行中のジョブ(この場合はman bash)がフォアグラウンドになります。引数なしで「fg」を実行した場合、“直前のジョブ”がフォアグラウンドになります。直前のジョブは、jobsコマンドで表示した際に「+」記号で示されます。

●筆者紹介
○西村 めぐみ(にしむら めぐみ)
PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。

最終更新:7/24(月) 7:55
@IT