プログラムをバックグラウンドで走らせる

UnixはマルチタスクのOSである。マルチタスクとは複数の仕事を同時にこなす ことができることである。複数のユーザが同時に仕事ができるだけでなく、 ひとりのユーザーが複数の仕事を並行して進めることができる。 これに対し、MS-DOSはシングルタスク・シングルユーザのOSであり、一度に一人 のユーザーがひとつのジョブ(仕事)しか走らせられない。

端末画面やキーボード(以下「端末」という)で入出力をする必要のない プログラムは、「バックグラウンド」(background, 「裏側」というような意味) で走らせておき、端末では別の仕事をすることができる。 端末を使うほうをバックグラウンドに対してフォアグラウンドという (foreground, 「おもて」という意味)。

たとえば、program という名前の機械語のプログラム (あるいは、「シェルスクリプト」)が あるとすると、 次のように、コマンド行の最後に & マークをつけて起動することで、 それをバックグラウンドで走らせることができる。

% program &
[1] 1221
(あとに表示されているのは、割り当てられたジョブ番号とプロセス番号であ り、そのときどきによって変わる。 ここではジョブとプロセスについて詳しくは述べない。 ただ、killコマンドで止める場合、上の例に合わせていえば という区別があることにだけ注意しておく。)

この方法で時間のかかる計算のプログラムを走らせてもよいが、 授業ユーザーのプロセスは次の時間に残っていないようにする約束なので、 端末の使用を終了する前に ps コマンドで自分のプロセスを確認し、killコマ ンド(あるいはfgコマンドとコントロールCなど)で終了させておくのを 忘れないこと。(詳しい方法はマニュアル参照、psはいろいろ試してみる とよい。)

netscape (webブラウザ)や、emacs (エディタ)は、 画面表示をしたり、キーボードからの入力を受け付けるけれども、これは Xウィンドウシステムの機能を使っていて、端末 (ktermなど。DECの場合には「漢字端末エミュレータ」となっている) の入出力機能を使っていない。 (ただし、emacsをオプション -nw つきで起動した場合は端末を使う。) したがって、netscapeやemacsを & つきで起動しても実行にさしつかえないし、 そうすれば起動した端末画面が解放されるのでそこで別の仕事をする ことができる(ただし、その端末画面を閉じてしまうことは勧められない)。

もう知っていると思うが、emacsを起動すると新しいウィンドウが開く。 コンパイル・実行のたびにこのウィンドウを閉じているのは非常に面倒である。 こういう時に、emacsをバックグラウンドで走らせてウィンドウを開けっぱなしに しておけば、マウスカーソルを動かすだけでプログラムの編集とコンパイル・実行 のための端末画面のウィンドウを行き来できる。

ただし、たとえばPascalのプログラムをコンパイルするとすれば、コンパイラは 「なになに.p」というファイルをディスク上から読むわけだから、それまでに 編集したテキストをセーブしておかなければならない。 emacsの中のバッファ内容 が変わっただけでは反映されない。emacsでは下のほうに、編集後の内容がセーブ されていない場合に「**」、された場合に「--」と表示される部分がある。 これを参照してセーブするタイミングを決めるとよい。 (実はemacsの中からコンパイラを起動する方法もあるが、その話は省略する。)

prog1.p を編集して書き出し (c-x c-s)、次にprog2.fを編集するならば、 emacsを終えたり、もう一つ起動したりする必要はない。 c-x c-f (つまり find-file) に続いて prog2.f を指定すればよい。 emacsはウィンドウを分割する機能もあるので、複数のファイルを同時に 編集したいときもemacsは1つ起動すればじゅうぶんである。

Unixのコマンドを受け付ける部分が csh (Cシェル)ならば、 いったんフォアグラウンドで動かしたプログラムを、コントロールZ (Ctrlキーを押しながらZのキーを押す)で一時停止(suspend)させ、

% bg
とすることによってバックグラウンドに移すこともできる。 また、バックグラウンドで動いているプログラムを
% fg
でフォアグラウンドに持っていくこともできる。 端末入出力を必要とするプログラムをバックグラウンドに入れてしまった場合 は、このようにして対策する。 バックグラウンドで複数のジョブが動いている場合の区別のしかたなどの 問題があるが、実際に必要が生じれば説明することにする。


1996-04-28; 2000-06-28; 2002-07-11
増田 耕一 (MASUDA Kooiti)
この記事の旧版(1993年)の作成には伊藤孝士氏に協力していただきました。

[目次へ]