UNIX では,二つ以上のコマンドを一つの単位として,一度に実行することができます。
この実行の単位のことをジョブ (job) といいます。例えば,
ls -al /etc | more
のような
パイプラインはジョブの一例です。
コマンドを単独で実行したときには,それが実行の単位となりますので,コマン ド19とジョブは同じものになります。例えば ls -al /etc もジョ ブです。
なお,本章を理解する上では,これまでコマンドと言ってきたものを,これ以降はジョ ブという言葉で置き換えることがある,と考えるだけでも差し支えはありません。
xclock -update 1とタイプして <ENTER> を押し,xclock を起動してください。ここで -update 1 (数字の1) は 1 秒ずつ秒針を刻むためのオプションです。
xclock が実行中であるため,xclock を起動したウィンドウにはプロン プトが戻らず,シェルへの入力(別のコマンドの実行)ができないこと を確認しておきましょう。ここに例えば ls <ENTER> を入力しても,ls は実行されません。実行中のジョブである xclock に対して入力する状 態になっているからです。
このように通常の方法で起動したジョブを フォアグラウンドジョ ブ (foreground job) といいます。
実行中のジョブを強制終了させるのが CTRL-c でしたね。フォアグラ ウンドジョブに対しては,通常,CTRL-c が有効です。ただし,コマン ド(プログラム)によっては,CTRL-c による終了ができないものもあ ります20。
xclock が 終了するとプロンプトが表示され,再びコマンド行から別のコマンドを 実行することが可能になります。
CTRL-z を使うと,コマンド入力が可能なウィンドウが一つしか存在しない状 態であっても,現在行っている作業(フォアグラウンドジョブ)を完全には止め ないままで別の作業を行うことができます21。それが終わったら fg で元の作業に 戻ることができます。
以下を試してください。
(よくわかんないなぁ。)
CTRL-z はジョブを「一時的に停止」(中断; suspend) します。 ジョブが中断すると,プロンプトが現れて,別の UNIX コマンドを実 行できるようになります。
ls -R
を試してみましょう。
(-R を付けると,サブディレクトリの下のファイルも全部表示されるんだ! ところでマニュアルでは何て言葉つかってたっけ?)
fg (foreground) は中断した(一時停止中の) ジョブをフォアグラウンドジョブとして再開させます。
中断した jman の実行を再開させたので,先ほど表示していた -R の箇 所が表示されます。
(再帰的か,なるほど。22)
上記の操作はコマンド行と同じウィンドウ内に結果を表示する文字ベースのコマ ンドに対するものでしたが,起動時にウィンドウを新規に作成して,そこに絵を 表示する X アプリケーションに対しても,ジョブの中断や再開の操作が可能で す。
CTRL-z はジョブを中断(一時停止)させるので, xclock を起動したウィンドウに Suspended と表示されてプロンプトが 戻ってくるとともに,時計の針の動きが止まります。
しかし xclock はまだ終了していないので,時計自体は表示されたまま であることに注意してください。
ジョブが中断すると,そのジョブの起動元のプロンプト に新しいコマンドを入力して実行できるようになります。 すなわち,再びシェルへの入力が可能になります。
ジョブが中断すると,そのジョブはキー入力を受け付けません。ジョブ の起動元ウィンドウから,中断したジョブを制御することもできません。
今の場合,再度プロンプトが表示されるだけで,中断している xclock には CTRL-c は影響しません23。
中断していた xclock の実行がフォアグラウンドジョブとして再開し, 時計の針が動き出します。プロンプトが戻らないことも確認しておきま しょう。
フォアグラウンドジョブは CTRL-c を受け付けます。そのため xclock が終了します。
xclock -update 1
CTRL-z
bg
時計が動き出します。さらに, fg を実行したときとは異なり, ジョブの起動元のウィンドウにはプロンプトも現れ,別のジョブが実行 可能になりました。このようなジョブをバックグラウンドジョブ (background job) といいます。終了するまでに時間のかかるジョブをバッ クグラウンドジョブにしておけば,その間に別の仕事を行うことができ ます。
bg (background) は,中断しているジョブ をバックグラウンドジョブにするコマンドです。
xclock -update 2 &
バックグラウンドジョブが二つになりました。
man lsを順に実行してください。 もし CTRL-z を押してもプロンプトが現れなければ,<ENTER> を押して みてください。
CTRL-z
jobsがあります。試してください。すると,三つのジョブに関する次の表示 が得られます。
[1] Running xclock -update 1 [2] - Running xclock -update 2 [3] + Suspended man ls表示の意味は次のとおりです。
fg や bg コマンドを引数無しで実行したときに,実行対象とな るのがカレントジョブです。
結果を確認したら,再度 CTRL-z でフォアグラウンドジョブを 中断してから,jobs コマンドを実行してください。
これまでは,中断しているジョブを再開させるために fg を使いました が,バックグラウンドジョブをフォアグラウンドジョブにするときにも fg が使えます。
ただし,番号 2 のジョブはカレントジョブではありませんので,fg と タイプして実行するのでは不十分です。fg や bg では,引数を使って対 象となるジョブを指定できます。コマンド実行の形式は
fg %ジョブ番号です。ここでは fg %2 を実行してください。
bg %ジョブ番号
kill %ジョブ番号とします。
jobs コマンドでジョブの一覧を表示してから,kill %1 を試し てください。
バックグラウンドで動いていた1秒刻みの時計が終了(terminate)しましたね。
まず,ジョブの各動作状態における特徴をまとめます。
ジョブの動作状態間の関係を次の図にまとめます。
ジョブの動作状態とその変更法を確認するために,上の図を見ながら, 以下を順に実行してください。
時計は動いたままですが,時計の起動元ウィンドウからはプロンプト が消えました。すなわち,xclock はバックグラウンドジョブから フォアグラウンドジョブに変わりました。
時計の針が止まりましたね。フォアグラウンドジョブ (xclock) は CTRL-z を受け付けますので,xclock は中断しました。すなわち, xclock はフォアグラウンドジョブから中断した状態に変わ りました。
時計が動き出すとともに,時計 (xclock) がジョブ起動元のウィン ドウを占有し,プロンプトは戻りません。 中断していた xclock はフォアグラウンドジョブに変わり ました。
xclock はフォアグラウンドジョブから中断した状態に変わ りました。
fg を実行したときと同様に時計が動き出しますが,コマ ンドの起動元のウィンドウにはプロンプトが表われ,別のジョブが実 行可能な状態になります。 すなわち,xclock は中断状態から バックグラウンドジョブに変わりました。
時計 (xclock) は,現在,バックグラウンドジョブになっていますから, このままでは CTRL-c は効きません。ジョブの一覧を確認し,xclock をフォアグラウンドジョブに変更してから強制終了させてください。
command フォアグラウンドジョブとして command を実行する。 command & バックグラウンドジョブとして command を実行する。 CTRL-c フォアグラウンドジョブの強制終了 CTRL-z フォアグラウンドジョブの中断 fg [%n]
中断しているジョブやバックグラウンドジョブをフォアグラウンドジョブとして 実行する。 %n を指定するとジョブ番号n のジョブが対象となり, 省略するとカレントジョブが対象となる。 bg [%n] 中断しているジョブをバックグラウンドジョブとして再開する。 %n を指定するとジョブ番号n のジョブが対象となり, 省略するとカレントジョブが対象となる。 kill %n ジョブ番号 n のジョブを強制終了させる。 jobs ジョブの一覧表示
同じ計算機を使っているユーザー数を表示するように nu を変更 してください。
そのためには,Emacs の実行を再開する必要があります。 バックグラウンドジョブとして再開してください。
emacs -nw で Emacs を起動すると,Emacs はコマンドを 打ったウィンドウ内で動作しますので,以降の作業は第 6.3 (p. ) に示した ls のマニュアル閲覧の手順が参考になります。
なお,ここで起動した Emacs の操作はすべてキーボードから行 うことになります。