前回は、シェルがコマンドを実行する際の単位である「ジョブ」について、X環境を使って動作を確かめました。今回は、コマンドライン環境でのジョブコントロールを試してみましょう。X環境を持たないサーバ管理やリモート接続時に役立つ操作です。
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コマンドを実行すると、終了を待たずにすぐに次のプロンプトが表示されます(画面1)。
ここで「jobs」コマンドを実行すると、「[1]」というジョブが動いていることが分かります(画面2)。
バックグラウンドジョブが終了すると“次のコマンドを実行したとき”に、その旨が表示されます。次の実行画面では、findコマンドで出力した「found.log」の行数(=見つかったファイルの件数)を、「wc」コマンドでカウントしています(画面3)。
“端末で実行したい時間がかかる処理”というと、代表的な処理に「コンパイル」があります。
典型的な操作コマンドが「./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を実行する」という内容になります。
Copyright © ITmedia, Inc. All Rights Reserved.