next up previous contents
Next: A. 問題の解答例 Up: UNIX 基礎演習 B 組 Previous: 5 パイプとフィルタ

Subsections


6 ジョブ制御

6.1 ジョブ

UNIX では,二つ以上のコマンドを一つの単位として,一度に実行することができます。 この実行の単位のことをジョブ (job) といいます。例えば, ls -al /etc | more のような パイプラインはジョブの一例です。

コマンドを単独で実行したときには,それが実行の単位となりますので,コマン ド19とジョブは同じものになります。例えば ls -al /etc もジョ ブです。

なお,本章を理解する上では,これまでコマンドと言ってきたものを,これ以降はジョ ブという言葉で置き換えることがある,と考えるだけでも差し支えはありません。

6.2 フォアグラウンドジョブと強制終了: CTRL-c

  1. コマンド行に
    xclock -update 1
    とタイプして <ENTER> を押し,xclock を起動してください。ここで -update 1 (数字の1) は 1 秒ずつ秒針を刻むためのオプションです。

    xclock が実行中であるため,xclock を起動したウィンドウにはプロン プトが戻らず,シェルへの入力(別のコマンドの実行)ができないこと を確認しておきましょう。ここに例えば ls <ENTER> を入力しても,ls は実行されません。実行中のジョブである xclock に対して入力する状 態になっているからです。

    このように通常の方法で起動したジョブを フォアグラウンドジョ ブ (foreground job) といいます。

  2. xclock を起動したウィンドウに CTRL-c を入力して xclock を終了さ せましょう。

    実行中のジョブを強制終了させるのが CTRL-c でしたね。フォアグラ ウンドジョブに対しては,通常,CTRL-c が有効です。ただし,コマン ド(プログラム)によっては,CTRL-c による終了ができないものもあ ります20

    xclock が 終了するとプロンプトが表示され,再びコマンド行から別のコマンドを 実行することが可能になります。


6.3 フォアグラウンドジョブの中断と再開 : CTRL-z と fg

CTRL-z を使うと,コマンド入力が可能なウィンドウが一つしか存在しない状 態であっても,現在行っている作業(フォアグラウンドジョブ)を完全には止め ないままで別の作業を行うことができます21。それが終わったら fg で元の作業に 戻ることができます。

以下を試してください。

  1. マニュアルで ls のオプション -R の意味を調べてみましょう。 jman ls を実行して,-R の説明を読んでください。

    (よくわかんないなぁ。)

  2. CTRL-z を押してみましょう。

    CTRL-z はジョブを「一時的に停止」(中断; suspend) します。 ジョブが中断すると,プロンプトが現れて,別の UNIX コマンドを実 行できるようになります。

  3. ls -R を試してみましょう。

    (-R を付けると,サブディレクトリの下のファイルも全部表示されるんだ! ところでマニュアルでは何て言葉つかってたっけ?)

  4. fg コマンドを実行してみましょう。

    fg (foreground) は中断した(一時停止中の) ジョブをフォアグラウンドジョブとして再開させます。

    中断した jman の実行を再開させたので,先ほど表示していた -R の箇 所が表示されます。

    (再帰的か,なるほど。22)

  5. jman を正規の方法で終了させましょう。q を打ちます。

上記の操作はコマンド行と同じウィンドウ内に結果を表示する文字ベースのコマ ンドに対するものでしたが,起動時にウィンドウを新規に作成して,そこに絵を 表示する X アプリケーションに対しても,ジョブの中断や再開の操作が可能で す。

  1. xclock -update 1 を実行しましょう。

  2. xclock を起動したウィンドウで CTRL-z を押してください。

    CTRL-z はジョブを中断(一時停止)させるので, xclock を起動したウィンドウに Suspended と表示されてプロンプトが 戻ってくるとともに,時計の針の動きが止まります。

    しかし xclock はまだ終了していないので,時計自体は表示されたまま であることに注意してください。

  3. プロンプトに対して ls と打って <ENTER> を押してみましょう。

    ジョブが中断すると,そのジョブの起動元のプロンプト に新しいコマンドを入力して実行できるようになります。 すなわち,再びシェルへの入力が可能になります。

  4. プロンプトに対して CTRL-c と打ってみましょう。

    ジョブが中断すると,そのジョブはキー入力を受け付けません。ジョブ の起動元ウィンドウから,中断したジョブを制御することもできません。

    今の場合,再度プロンプトが表示されるだけで,中断している xclock には CTRL-c は影響しません23

  5. プロンプトに対して fg と打って <ENTER> を押してみましょう。

    中断していた xclock の実行がフォアグラウンドジョブとして再開し, 時計の針が動き出します。プロンプトが戻らないことも確認しておきま しょう。

  6. xclock を起動したウィンドウで CTRL-c を押してください。

    フォアグラウンドジョブは CTRL-c を受け付けます。そのため xclock が終了します。

注意 1

ジョブの中断と終了は異なるものです。中断したジョブは fg で再開できま すが,終了したジョブを再開することはできません。

注意 2

中断状態のジョブを終了するには, fg でジョブを再開する等の手続きが必要です。

注意 3

CTRL-z でジョブを中断したら,ログアウトする前に,中断したジョブ を 終了させてください。 exit コマンドを実行して There are suspended jobs. というメッセージ が出たら,中断しているジョブが残っているということです。

6.4 バックグラウンドジョブ

  1. 再度,1 秒刻みの時計をフォアグラウンドで実行してから,中断させま しょう。
    xclock -update 1
    CTRL-z

  2. 次のコマンドを実行してみましょう。
    bg

    時計が動き出します。さらに, fg を実行したときとは異なり, ジョブの起動元のウィンドウにはプロンプトも現れ,別のジョブが実行 可能になりました。このようなジョブをバックグラウンドジョブ (background job) といいます。終了するまでに時間のかかるジョブをバッ クグラウンドジョブにしておけば,その間に別の仕事を行うことができ ます。

    bg (background) は,中断しているジョブ をバックグラウンドジョブにするコマンドです。

  3. ジョブの中断状態を経ずに,コマンド行からバックグラウンドジョブを動かすこ ともできます。 コマンド行の最後に & を付けて,2 秒刻みの xclock を起動してみましょう。
    xclock -update 2 &

    バックグラウンドジョブが二つになりました。


6.5 ジョブの一覧と選択的操作

  1. バックグラウンドジョブの時計に加え,新たにジョブを起動して中断状 態にします。そのために
    man ls
    CTRL-z
    を順に実行してください。 もし CTRL-z を押してもプロンプトが現れなければ,<ENTER> を押して みてください。

  2. 中断しているジョブとバックグラウンドジョブの一覧を見るコマンドと して
    jobs
    があります。試してください。すると,三つのジョブに関する次の表示 が得られます。
    [1]    Running                       xclock -update 1
    [2]  - Running                       xclock -update 2
    [3]  + Suspended                     man ls
    
    表示の意味は次のとおりです。

  3. 何が起きるかを予想してから,fg を実行してみましょう。

    結果を確認したら,再度 CTRL-z でフォアグラウンドジョブを 中断してから,jobs コマンドを実行してください。

  4. バックグラウンドで実行中のジョブ番号 2 のジョブをフォアグラウンド ジョブにします。

    これまでは,中断しているジョブを再開させるために fg を使いました が,バックグラウンドジョブをフォアグラウンドジョブにするときにも fg が使えます。

    ただし,番号 2 のジョブはカレントジョブではありませんので,fg と タイプして実行するのでは不十分です。fg や bg では,引数を使って対 象となるジョブを指定できます。コマンド実行の形式は

    fg %ジョブ番号
    bg %ジョブ番号
    です。ここでは fg %2 を実行してください。

  5. フォアグラウンドジョブになった時計を強制終了させましょう。 CTRL-c でしたね。

  6. バック グラウンドジョブや,中断しているジョブを強制終了させることもでき ます。そのためには
    kill %ジョブ番号
    とします。

    jobs コマンドでジョブの一覧を表示してから,kill %1 を試し てください。

    バックグラウンドで動いていた1秒刻みの時計が終了(terminate)しましたね。

  7. 残っているジョブ (man ls) をフォアグラウンドにしてから,正常に終 了させましょう。

6.6 ジョブの動作状態のまとめ

まず,ジョブの各動作状態における特徴をまとめます。

  1. フォアグラウンドジョブ
    1. ジョブは動いている
    2. 当該ジョブは,ジョブを起動したウィンドウからのキー入力を受 け付ける (CTRL-c や CTRL-z が効く) = 別のジョブを実行 できない

  2. 中断
    1. ジョブは停止している
    2. 当該ジョブは,ジョブを起動したウィンドウからのキー入力を受 け付けない(CTRL-c や CTRL-z が効かない) = 別のジョブを 実行できる

  3. バックグラウンドジョブ
    1. ジョブは動いている
    2. 当該ジョブは,ジョブを起動したウィンドウからのキー入力を受 け付けない(CTRL-c や CTRL-z が効かない) = 別のジョブを 実行できる

ジョブの動作状態間の関係を次の図にまとめます。

\includegraphics[clip]{jobs.eps}

ジョブの動作状態とその変更法を確認するために,上の図を見ながら, 以下を順に実行してください。

  1. 1 秒刻みの時計を,コマンド行の終りに & を付けて起動してください。

  2. 時計は バックグラウンドジョブとして動作していますので,起動 元ウィンドウ(コマンド行) に対して,CTRL-c や CTRL-z を打って も時計の動作は変わりません。確認しておきましょう。

  3. fg コマンドを実行してください。

    時計は動いたままですが,時計の起動元ウィンドウからはプロンプト が消えました。すなわち,xclock はバックグラウンドジョブから フォアグラウンドジョブに変わりました。

  4. ここで CTRL-z を押してください。

    時計の針が止まりましたね。フォアグラウンドジョブ (xclock) は CTRL-z を受け付けますので,xclock は中断しました。すなわち, xclock はフォアグラウンドジョブから中断した状態に変わ りました。

  5. fg コマンドを実行して,その意味を再度確認しておきましょう。

    時計が動き出すとともに,時計 (xclock) がジョブ起動元のウィン ドウを占有し,プロンプトは戻りません。 中断していた xclock はフォアグラウンドジョブに変わり ました。

  6. 再度 CTRL-z を押してください。

    xclock はフォアグラウンドジョブから中断した状態に変わ りました。

  7. bg コマンドを実行してください。

    fg を実行したときと同様に時計が動き出しますが,コマ ンドの起動元のウィンドウにはプロンプトが表われ,別のジョブが実 行可能な状態になります。 すなわち,xclock は中断状態から バックグラウンドジョブに変わりました。

  8. 時計を止めましょう。

    時計 (xclock) は,現在,バックグラウンドジョブになっていますから, このままでは CTRL-c は効きません。ジョブの一覧を確認し,xclock をフォアグラウンドジョブに変更してから強制終了させてください。

6.7 コマンド等のまとめ

command フォアグラウンドジョブとして command を実行する。
command & バックグラウンドジョブとして command を実行する。
CTRL-c フォアグラウンドジョブの強制終了
CTRL-z フォアグラウンドジョブの中断

fg [%n]

中断しているジョブやバックグラウンドジョブをフォアグラウンドジョブとして 実行する。 %n を指定するとジョブ番号n のジョブが対象となり, 省略するとカレントジョブが対象となる。
bg [%n] 中断しているジョブをバックグラウンドジョブとして再開する。 %n を指定するとジョブ番号n のジョブが対象となり, 省略するとカレントジョブが対象となる。
kill %n ジョブ番号 n のジョブを強制終了させる。
jobs ジョブの一覧表示


6.8 問題

  1. 同じ計算機を利用しているユーザーの数のみを出力するコマンド nu を 作成します。以下の指示に従って作業をしてください。なお,一人のユー ザーが同じ計算機に複数ログインしている場合,ユーザー数ではなく, ログイン数を数えればよいこととします。

    1. カレントディレクトリに nu という名前のファイルが存在しないことを 確認してください。

    2. emacs をフォアグラウンドジョブとして起動して,who と だけ書いてあるファイルを作成してください。ファイル名は nu としてください。ファイル作成後も Emacs は終了しないでくだ さい。

    3. Emacs を一時中断(終了ではない)してから,ファイル nu が存在 することを確認してください。

    4. ファイル nu に実行可能のアクセス権を与え,nu をコマンドとして実 行してください。who を実行したときと同じ出力が得られるはずです。

    5. 同じ計算機を使っているユーザー数を表示するように nu を変更 してください。

      そのためには,Emacs の実行を再開する必要があります。 バックグラウンドジョブとして再開してください。

    6. nu コマンドを実行して,望みの結果が得られることを確認して ください。

    7. 正規の方法で emacs を終了させてください。

  2. カレントディレクトリに存在するファイル(. で始まるものは除く)の 個数を求めるコマンド nf を作成します。以下の指示に従って作業をし てください。

    1. カレントディレクトリに nf という名前のファイルが存在しない ことを確認してください。

    2. emacs -nw を実行して Emacs を起動してください。

      emacs -nw で Emacs を起動すると,Emacs はコマンドを 打ったウィンドウ内で動作しますので,以降の作業は第 6.3 (p. [*]) に示した ls のマニュアル閲覧の手順が参考になります。

      なお,ここで起動した Emacs の操作はすべてキーボードから行 うことになります。

    3. 実行中の Emacs でファイル nf を作成してください。nf の内容 は各自で考えてください。次項の作業が完了するまで Emacs を 終了しないでください。

    4. ファイル nf に実行可能のアクセス権を与え,nf をコマンドと して実行してください。

    5. 全ての作業が終了したら,Emacs を正規の操作で終了してくださ い。


next up previous contents
Next: A. 問題の解答例 Up: UNIX 基礎演習 B 組 Previous: 5 パイプとフィルタ

平成18年1月26日