Jump to content 日本-日本語

製品  >  ソフトウェア  >  HP-UX   >  Knowledge-on-Demand  >  UNIXの教科書 応用編

UNIXの教科書 応用編
〜はじめよう! WindowsとLinuxからのステップアップ〜

第5日目:ジョブとプロセスの操作

HP-UX/Integrityサーバー お問い合せ
コンテンツに進む
第5日目:ジョブとプロセスの操作
UNIXの教科書 応用編〜はじめよう! WindowsとLinuxからのステップアップ〜 5日目
ジョブの基本的な取り扱い
ジョブとプロセスの管理

2時間目:ジョブとプロセスの管理

フォアグラウンドジョブとバックグラウンドジョブが理解できたところで、ジョブの停止やフォアグラウンドジョブとバックグラウンドジョブの切り替えといった管理について説明しましょう。また、システムにおける実行中のプログラムの単位であるプロセスについても説明します。

フォアグラウンドジョブを一時停止する

フォアグラウンドジョブを実行中に別のコマンドを実行したくなった場合には、いったんフォアグラウンドジョブを一時停止(サスペンド)させた後に、バックグラウンドジョブとして再開します。その後で、別のコマンドを実行すれば両方のコマンドを同時に実行できます。
フォアグラウンドジョブを一時停止するには「Ctrl + Z」キーを押します。すると「Stopped」と表示されます。

$ xclock
  ←Ctrl + Zを入力 【Enter】
[1]+  Stopped                 xclock

この状態でjobsコマンドを実行すると、一時停止されたジョブがカレントジョブであることがわかります。

$ jobs 【Enter】
[1]+  Stopped                 xclock  ←カレントジョブとなる

四色君:
一時停止されたジョブは完全に止まっているのですか?
四色君
マリー先生
マリー先生:
そうよ、「Ctrl + Z」キーが押された時点の状態で停止しているの。xclockの場合、時計の針が動かなくなることで確認できるわ。

一時停止中のジョブを再開する

一時停止中のジョブをバックグラウンドジョブとして再開するには、bgコマンドを使います。

bg %ジョブ番号

引数にはジョブ番号を「%ジョブ番号」の形式で指定します。ジョブ番号「1」のジョブをバックグラウンドジョブとして再開するには、次のようにします。

$ bg %1 【Enter】  ←バックグラウンドジョブとして再開
[1]      xclock
$ jobs 【Enter】 ←jobsコマンドで確認
[1] +   Running                 xclock  ←ステータスが「Running」になった

バックグラウンドジョブをフォアグラウンドジョブにする

逆に、指定したバックグラウンドジョブをもしくは一時停止中のジョブを、フォアグラウンドジョブにするにはfgコマンドを使います。

fg %ジョブ

たとえば、ジョブ番号「2」のバックグラウンドジョブを、フォアグラウンドジョブにするには次のようにします。

$ fg %2 【Enter】
xclock

タックス君:
bgコマンドとfgコマンドを、引数を指定しないで実行するとどうなるのですか?
タックス君
マリー先生
マリー先生:
引数を指定しないか「%+」を指定しても、カレントジョブが対象となるの。プリビアスジョブを対象とするには「%-」を指定してもいいわ。

ジョブとプロセス

個々のターミナルで実行中のコマンドは、それぞれのシェルで個別にジョブとして扱われます。つまり、複数のターミナルでコマンドを実行した場合、それぞれのターミナルでジョブ番号が1から順に割り当てられます。それに対して、システムから見たプログラムの実行単位のことを「プロセス」と呼びます。個々のプロセスには「プロセスID」と呼ばれる番号が割り当てられますが、ジョブ番号と異なりシステム内で重複はありません。たとえば、2つのターミナルを開いてそれぞれでxclockを起動した場合、どちらもジョブ番号は「1」となりますが、プロセスIDは異なる番号になります。

jobsコマンドに、「-l」オプションをつけて実行すると、ジョブ番号とプロセスIDの両方を確認できます。

$ jobs -l 【Enter】

実行中のプロセス一覧を表示する

現在実行中のプロセスの一覧を表示するにはpsコマンドを使います。引数なしで実行すると、ターミナル内で実行されているプロセスの一覧が表示されます。次に、xclockをバックグラウンドジョブとして実行している状態でのpsコマンドの結果を示します。PIDのフィールドにプロセスIDが表示されています。

$ ps 【Enter】

タックス君:
psコマンド自体もプロセスとして表示されるのですね。
タックス君
マリー先生
マリー先生:
そうよ。それと「sh」と表示されているのがシェルね。シェルもシステム的には単なるコマンドファイルにすぎず、ひとつのプロセスなの。「TTY」のフィールドにはプロセスの実行されているターミナルの名前が表示されるわ。

なお、システム内のすべてのプロセス一覧を詳しく表示するには「-ef」オプションを指定して実行します。

$ ps -ef 【Enter】
     UID   PID  PPID  C    STIME TTY       TIME COMMAND
    root     0     0  0 15:11:09 ?         0:14 swapper
    root     1     0  0 15:10:36 ?         0:00 init
    root    13     0  0 15:10:51 ?         0:00 net_str_cached
    root    12     0  0 15:10:51 ?         0:00 net_str_cached
    root    11     0  0 15:10:51 ?         0:00 escsid
    root    10     0  0 15:10:36 ?         0:00 ObjectThreadPool
〜中略〜
      o2  4182  4175  0 15:38:10 pts/2     0:00 /sbin/sh
      o2  3993  3991  0 15:30:40 ?         0:00 /usr/dt/bin/dtsession
      o2  4175  4174  0 15:37:54 ?         0:00 /usr/dt/bin/dtterm
〜以下略〜

四色君:
TTYのフィールドが「?」になっているプロセスがたくさんありますね。
四色君
マリー先生
マリー先生:
「?」が表示されているプロセスは、特定のターミナルと結びついていないプロセスなの。たとえば、通常システムの起動時に起動してバックグラウンドで動作し続ける「デーモン」と呼ばれるプロセスがそうね。あとは、デスクトップのメニューから起動したアプリケーションも「?」と表示されるわ。

タックス君:
PPIDのフィールドに表示されている番号はなんですか?
タックス君
マリー先生
マリー先生:
プロセスには親子関係があるのだけど、PPIDは「Parent Process ID」の略で、そのプロセスを起動したプロセス、つまり親プロセスのプロセスIDなの。


マリー先生
マリー先生:
ところで、2つのコマンドをパイプで接続して実行したような場合には、ジョブとプロセスではどのように扱われると思う?
タックス君:
2つのコマンドを実行しているわけだから、2つのジョブ、2つのプロセスとなるのではないでしょうか?
タックス君
マリー先生
マリー先生:
実はジョブとしてはひとつだけど、プロセスとしては2つになるの。例として、xclockとgrepコマンドをパイプで接続して実行してみましょう。

$ xclock | grep "test" & 【Enter】
[2]     7241

マリー先生
マリー先生:
xclockは標準出力にメッセージを出さないからこのコマンドライン全体に意味はないけど、ジョブとプロセスの確認にはなるでしょう。次のようにjobsコマンドとpsコマンドで確認してね。

$ jobs 【Enter】
[2] +  Running                    xclock | grep "test" &
↑ジョブとしてはひとつ
$ ps 【Enter】
   PID TTY       TIME COMMAND
  7241 pts/0     0:00 grep    ←コマンドごとにプロセスになる
  7242 pts/0     0:00 xclock  ←コマンドごとにプロセスになる
  5547 pts/0     0:00 sh
  7255 pts/0     0:00 ps

プロセスにシグナルを送信する

実行中のジョブまたはプロセスは、「シグナル」と呼ばれるメッセージを受け取ります。たとえば、フォアグラウンドジョブを実行中に「Ctrl + C」キーを押すとジョブが強制終了されますが、これは「Ctrl + C」キーが、「SIGINT」というコマンドを終了させるシグナルの送信にアサインされているからです。また、フォアグラウンドジョブを一時停止させる「Ctrl + Z」キーでは、「SIGTSTP」というコマンドを一時停止させるシグナルが送られます。

コマンドラインでシグナルを送るには、killコマンドを使用します。

kill -s シグナル プロセスもしくはジョブ

ジョブを送り先にするには「%ジョブ番号」を指定します。プロセスを送り先にするには「プロセスID」を指定します。シグナルはシグナル名もしくはシグナル番号で指定します。
なお、「-s シグナル」を省略した場合には、プロセスを終了させる「SIGTERM」というシグナルが送られます。たとえば、ジョブ番号「1」のジョブにSIGTERMシグナルを送信して終了するには次のようにします。

$ kill %1 【Enter】
$ 【Enter】  ←もう一度Enterキーを押す
[1] - Terminated                  xclock & ←終了したメッセージが表示される

なお、「SIGINT」や「SIGTERM」を送っても終了できない、いわゆる暴走状態のプログラムを終了させるには「SIGKILL」という強制終了のシグナルを送ります。
たとえば、プロセスIDが「7990」のプロセスにSIGKILLシグナルを送るには次のようにします。

$ kill -s SIGKILL 7990

四色君:
「ps -ef」で表示される任意のプロセスにシグナルを送れるのですか?
四色君
マリー先生
マリー先生:
システムのプロセスや、他人のプロセスが勝手に終了されては困るから、一般ユーザがシグナルを送れるのは自分のプロセスだけなの。

タックス君:
シグナルは、いろいろな種類があるのですか?
タックス君
マリー先生
マリー先生:
そうね、ここで紹介した以外だと、たとえば「SIGCONT」は一時停止中のプロセスを再開させるシグナルなの。「kill -l」を実行するとシグナルの一覧が表示できるわ。シグナル名の最初の「SIG」は省略されて表示されるの。あと、左に表示される番号はシグナル番号ね。

$ kill -l 【Enter】
 1) HUP
 2) INT
 3) QUIT
 4) ILL
 5) TRAP
 6) ABRT
 7) EMT
〜以下略〜

練習問題

第1問:xclockコマンドをバックグラウンドジョブとして実行するコマンドはどれか?

a) xclock
b) xclcok &
c) &xclcok
d) xclock $
正解はこちら
b) xclcok &
バックグラウンドジョブとして実行するには、コマンドの後ろに「&」を記述する。

第2問:ジョブ番号「2」のジョブが一時停止している時に、そのジョブをバックグラウンドジョブとして再開させるコマンドはどれか?

a) fg %2
b) bg 2
c) fg 2
d) bg %2
正解はこちら
d) bg %2
bgコマンドは一時停止中のジョブをバックグラウンドジョブとして再開するコマンド。ジョブ番号は「%ジョブ番号」で指定する。

第3問:現在実行中のジョブを一覧表示するコマンドはどれか?

a) ps
b) ls -j
c) jobs
d) showj
正解はこちら
c) jobs
jobsは実行中のジョブを一覧表示する組み込みコマンド。なお、a)は実行中のプロセスを一覧表示するコマンドである。

第4問:ジョブ番号が2のバックグラウンドジョブを一時停止させるコマンドはどれか?

a) kill %2
b) kill -s SIGTERM %2
c) kill -s SIGKILL 2
d)

kill -s SIGTSTP %2

正解はこちら
d) kill -s SIGTSTP %2
ジョブを一時停止させるにはkillコマンドでSIGTSTPシグナルを送ればよい。

連載記事一覧 戻る 1  |  2

教科書シリーズ 「UNIXの教科書」 「HAクラスターの教科書」 連載記事一覧

UNIXの教科書「基礎編」

第1日目:ログインしてコマンドを実行してみる
第2日目:ディレクトリやファイルを操作してみる
第3日目:シェルの基本を知る
第4日目:ファイルの基本操作
第5日目:viエディタの操作(基本編)
第6日目:リダイレクションとパイプを活用する
期末試験

UNIXの教科書「応用編」

第1日目:grepコマンドと正規表現
第2日目:ファイルの検索
第3日目:viエディタの操作(活用編)
第4日目:ファイルの圧縮とアーカイブ
第5日目:ジョブとプロセスの操作
第6日目:シェルの環境設定
第7日目:シェルスクリプトでより便利に
期末試験

UNIXの教科書「運用編」

第1日目:ユーザーの管理
第2日目:ファイルの安全管理(その1)
第3日目:ファイルの安全管理(その2)
第4日目:ネットワークの基本を理解する
第5日目:ネットワーク関連のコマンド
第6日目:システム情報の表示
期末試験 New!

HAクラスターの教科書

第1日目:ハードウェア構成を知る
第2日目:ネットワークを設定する
第3日目:共有ディスクを構成する
第4日目:HAクラスターを構成する
第5日目:パッケージを構成する
第6日目:障害テストを実施する
期末試験

 その他の連載記事


本ページの内容は執筆時の情報に基づいており、異なる場合があります。

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

HPEサポートセンター
製品の標準保証でご利用いただける無償のサービスです。

ショールーム

ショールーム 導入をご検討のお客様へ
業務アプリケーションの継続・標準化・開発性とシステム担当者様、システム開発者様が抱える悩み・疑問に対する解決策実体験して頂けます。
印刷用画面へ
プライバシー ご利用条件・免責事項