Unix-processes

提供:Dev Guides
移動先:案内検索

Unix/Linux-プロセス管理

この章では、Unixでのプロセス管理について詳しく説明します。 Unixシステムでプログラムを実行すると、システムはそのプログラム用の特別な環境を作成します。 この環境には、システム上で他のプログラムが実行されていないかのようにシステムがプログラムを実行するために必要なすべてが含まれています。

Unixでコマンドを発行するたびに、新しいプロセスが作成または開始されます。 ディレクトリの内容を一覧表示するために ls コマンドを試したとき、プロセスを開始しました。 プロセスは、簡単に言えば、実行中のプログラムのインスタンスです。

オペレーティングシステムは、 pid または process ID として知られる5桁のID番号でプロセスを追跡します。 システム内の各プロセスには一意の pid があります。

可能性のあるすべての数字が使い果たされ、次のpidがロールオーバーまたは最初からやり直されるため、最終的にPidが繰り返されます。 Unixは各プロセスを追跡するために使用するpidであるため、どの時点でも同じpidを持つ2つのプロセスはシステムに存在しません。

プロセスを開始する

あなたがプロセスを開始する(コマンドを実行する)とき、それを実行できる2つの方法があります-

  • 前景プロセス
  • バックグラウンドプロセス

前景プロセス

デフォルトでは、開始するすべてのプロセスはフォアグラウンドで実行されます。 キーボードから入力を取得し、画面に出力を送信します。

これは、 ls コマンドで確認できます。 あなたが現在のディレクトリ内のすべてのファイルを一覧表示する場合は、次のコマンドを使用することができます-

$ls ch*.doc

これにより、すべてのファイルが表示され、その名前は ch で始まり .doc で終わります-

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

プロセスはフォアグラウンドで実行され、出力は画面に送られます。 ls コマンドが入力を必要とする場合(必要ではありません)、キーボードからの入力を待機します。

プログラムがフォアグラウンドで実行されていて時間がかかる場合、プログラムが処理を終了して表示されるまでプロンプトが利用できないため、他のコマンドを実行(他のプロセスを開始)することはできません。

バックグラウンドプロセス

バックグラウンドプロセスは、キーボードに接続せずに実行されます。 バックグラウンドプロセスでキーボード入力が必要な場合、待機します。

バックグラウンドでプロセスを実行する利点は、他のコマンドを実行できることです。別の開始を完了するまで待つ必要はありません!

バックグラウンドプロセスを開始する最も簡単な方法は、コマンドの最後にアンパサンド()を追加することです。

$ls ch*.doc &

これは、名前が ch で始まり .doc で終わるすべてのファイルを表示します-

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

ここで、 ls コマンドが入力を必要とする場合(入力しない場合)、フォアグラウンドに移動してキーボードからデータを提供するまで停止状態になります。

その最初の行には、バックグラウンドプロセスに関する情報(ジョブ番号とプロセスID)が含まれています。 バックグラウンドとフォアグラウンドの間でジョブ番号を操作するには、ジョブ番号を知る必要があります。

Enterキーを押すと、次が表示されます-

[1]   +   Done                 ls ch*.doc &
$

最初の行は、 ls コマンドのバックグラウンドプロセスが正常に終了したことを示しています。 2番目は、別のコマンドのプロンプトです。

実行中のプロセスのリスト

次のように ps (プロセスステータス)コマンドを実行すると、独自のプロセスを簡単に確認できます-

$ps
PID       TTY      TIME        CMD
18358     ttyp3    00:00:00    sh
18361     ttyp3    00:01:31    abiword
18789     ttyp3    00:00:00    ps

psで最も一般的に使用されるフラグの1つは、次の例に示すように詳細情報を提供する -f (フルのf)オプションです-

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
*ps -f* コマンドで表示されるすべてのフィールドの説明は次のとおりです-
Sr.No. Column & Description
1

UID

このプロセスが属するユーザーID(実行している人)

2

PID

プロセスID

3

PPID

親プロセスID(それを開始したプロセスのID)

4

C

プロセスのCPU使用率

5

STIME

プロセス開始時間

6

TTY

プロセスに関連付けられた端末タイプ

7

TIME

プロセスにかかったCPU時間

8

CMD

このプロセスを開始したコマンド

*ps* コマンドと一緒に使用できる他のオプションがあります-
Sr.No. Option & Description
1

-a

すべてのユーザーに関する情報を表示します

2

-x

端末のないプロセスに関する情報を表示します

3

-u

-fオプションなどの追加情報を表示します

4

-e

拡張情報を表示します

プロセスの停止

プロセスの終了は、いくつかの異なる方法で実行できます。 多くの場合、コンソールベースのコマンドから、CTRL+を送信します。 Cキーストローク(デフォルトの割り込み文字)はコマンドを終了します。 これは、プロセスがフォアグラウンドモードで実行されている場合に機能します。

プロセスがバックグラウンドで実行されている場合、 ps コマンドを使用してジョブIDを取得する必要があります。 その後、次のようにプロセスを強制終了するために kill コマンドを使用できます-

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

ここで、 kill コマンドは first_one プロセスを終了します。 プロセスが通常のkillコマンドを無視する場合は、次のように kill -9 の後にプロセスIDを使用できます-

$kill -9 6738
Terminated

親プロセスと子プロセス

各UNIXプロセスには、プロセスID(pid)と親プロセスID(ppid)の2つのID番号が割り当てられています。 システム内の各ユーザープロセスには、親プロセスがあります。

実行するコマンドのほとんどには、親としてシェルがあります。 このコマンドがプロセスIDと親プロセスIDの両方をリストした ps -f の例を確認してください。

ゾンビと孤児のプロセス

通常、子プロセスが強制終了されると、親プロセスは SIGCHLD シグナルを介して更新されます。 その後、親は必要に応じて他のタスクを実行したり、新しい子を再起動したりできます。 ただし、子が殺される前に親プロセスが殺されることもあります。 この場合、「すべてのプロセスの親」である init プロセスが新しいPPID(親プロセスID)になります。 場合によっては、これらのプロセスは孤立プロセスと呼ばれます。

プロセスが強制終了されても、 ps リストに Z 状態のプロセスが表示される場合があります。 これはゾンビまたは機能しないプロセスです。 プロセスは停止しており、使用されていません。 これらのプロセスは、孤立プロセスとは異なります。 実行は完了しましたが、プロセステーブルにエントリが見つかります。

デーモンプロセス

デーモンは、システム関連のバックグラウンドプロセスであり、多くの場合、他のプロセスからのルートおよびサービス要求の権限で実行されます。

デーモンには制御端末がありません。 /dev/tty を開くことはできません。 "ps -ef" を実行して tty フィールドを見ると、すべてのデーモンには tty の*?*があります。

正確には、デーモンはバックグラウンドで実行されるプロセスであり、通常は動作可能な何かが起こるのを待っています。 たとえば、印刷コマンドを待っているプリンタデーモン。

長時間の処理を必要とするプログラムがある場合は、それをデーモンにしてバックグラウンドで実行する価値があります。

トップコマンド

*top* コマンドは、さまざまな基準でソートされたプロセスをすばやく表示するための非常に便利なツールです。

これは、頻繁に更新され、物理メモリと仮想メモリ、CPU使用率、負荷平均、ビジープロセスに関する情報を表示する対話型診断ツールです。

topコマンドを実行し、さまざまなプロセスによるCPU使用率の統計を確認するための簡単な構文を次に示します-

$top

ジョブIDとプロセスID

バックグラウンドおよび中断されたプロセスは、通常*ジョブ番号(ジョブID)*を介して操作されます。 この番号はプロセスIDとは異なり、短いため使用されます。

さらに、ジョブは、連続して、または同時に実行される複数のプロセスで構成できます。 ジョブIDの使用は、個々のプロセスを追跡するよりも簡単です。