この記事では、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
コマンドによって表示されるすべてのフィールドの説明です。
番号 | 列と説明 |
1 | UID プロセスが属するユーザーIDです。(プロセスを実行する方) |
2 | PID プロセスIDです。 |
3 | PPID 親プロセスIDです。(それを開始するプロセスID) |
4 | C プロセスのCPU使用率です。 |
5 | STIME プロセスの開始時間です。 |
6 | TTY プロセスに関連付けられている端末のタイプです。 |
7 | TIME プロセスが占めるCPU時間です。 |
8 | CMD このプロセスを開始するコマンドです。 |
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の使用は、単独のプロセスを追跡するよりも簡単です。
コメントを残す