28.7 ジョブ

以前にプロセスについて学びました. ここではプロセスにちょっと似た概念であるジョブについて学びましょう.

ジョブは, シェルにおける仕事の単位です. UNIXの処理の単位であるプロセスとの違いは以下のように説明されます. たとえば, パイプを使って,

promptlast | grep g999999 return2

というコマンドを実行すると,lastというプロセスと grep というプロセスの二つのプロセスが動きます. しかし, シェルにとっては一行で入力されたという意味では, 一回の仕事であると言えます. よって, これはジョブとしては一つなのです.

ジョブは起動されたシェルごとの概念です. よって, 違うターミナルウィンドウでは, 別のシェルが走っているので, 動いているジョブも異なります, しかし, プロセスは共通なので, どのターミナルウィンドウからpsコマンドを打っても同じ出力になります.

シェルは, 基本的には同時に一つの仕事(ジョブ)をします. 前のコマンドが終了しないと次のコマンドが打ち込めないということです.

あるターミナルウィンドウから, promptemacs return2 と打って Emacs を起動させたとしましょう. するとそのターミナルウィンドウでは Emacs を終了させるまで, 文字を入力することができないので, 新たな別の仕事をさせることができません. この時ターミナルウィンドウに何を打ち込んでも反応しないように見えてしまいます.

X の環境などでは, 別のターミナルウィンドウを起動すれば回避できますが, 大変に不便です.

シェルのジョブは, フォアグラウンドとバックグラウンドという二つの場所があります, 実はフォアグラウンドでは一つのジョブしか動かせませんが, バックグラウンドでは多数のジョブを動かすことができます. ですから, Emacsなどはバックグラウンドでジョブを動かせばよいのです. もちろん ls などのコマンドはバックグラウンドで動かす必要はありません. 大抵はすぐに終了しますし, その結果を見てから次のジョブを実行するからです. GUI のアプリケーションなど, 別個に動かしておきたいものをバックグラウンドで動かすと良いでしょう,

バックグラウンドでジョブを動かすには, コマンドの入力行の最後に & をつけます.

promptemacs & return2 [1] 22146

すると, Emacs が起動しているのに, プロンプトは次の入力を受け付けています. [1] 22146 の最初の 1 がジョブの番号です. そのあとがプロセスの ID です.

なお, ターミナル画面に出力のあるようなコマンドはバックグラウンドで実行しないほうがよいでしょう. 複数の出力が混ざってしまいます.

バックグラウンドでどのようなジョブが動いているか確認するには, jobs というコマンドを使ってください.

promptjobs return2 [1]+ Running emacs &