Unix / Linux-プロセス管理

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

Unixでコマンドを発行するたびに、新規プロセスが作成または開始されます。 lsコマンドを使用してディレクトリの内容を一覧表示しようとすると、プロセスが開始されました。 つまり、プロセスは実行中のプログラムのインスタンスです。

オペレーティングシステム(OS)は、pidまたはプロセス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コマンドによって表示されるすべてのフィールドの説明です。

番号列と説明
1UID
プロセスが属するユーザーIDです。(プロセスを実行する方)
2PID
プロセスIDです。
3PPID
親プロセスIDです。(それを開始するプロセスID)
4C
プロセスのCPU使用率です。
5STIME
プロセスの開始時間です。
6TTY
プロセスに関連付けられている端末のタイプです。
7TIME
プロセスが占めるCPU時間です。
8CMD
このプロセスを開始するコマンドです。

psコマンドと一緒に使用できるその他のオプションがあります。

番号オプションと説明
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番号が割り当てられています。 システム内のすべてのユーザープロセスには、親プロセスがあります。

実行するほとんどのコマンドは、shell(シェル)を親とします。 ps -fコマンドは、プロセスIDと親プロセスIDの両方をリストします。

ゾンビプロセスと孤児プロセス

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

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

デーモン

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

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

デーモンはバックグラウンドで実行されるプロセスであり、通常、処理できる何かが発生するのを待ちます。 例えば、プリンタデーモンは印刷コマンドを待機しています。

処理に時間がかかるプログラムの場合には、それをデーモンに設定し、バックグラウンドで実行します。

topコマンド

topコマンドは、さまざまな標準によるソート処理をすばやく表示するための非常に便利なツールです。

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

これは、topコマンドを実行し、さまざまなプロセスのCPU使用統計を表示するための構文です。

$top

ジョブIDとプロセスID

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

それ以外、ジョブは、並列または並列で実行される複数のプロセスで構成することができます。 ジョブIDの使用は、単独のプロセスを追跡するよりも簡単です。

Share

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です