さらに、LinuxはUNIXをベースとしており、複数のユーザーが同時に、かつ同一システム上で複数のコマンドを実行することが一般的なポリシーとなっています。当然のことながら、CPUがこれらのプロセスをすべて管理できるようにするための対策を講じる必要があり、ユーザーがプロセスを切り替えられる機能も提供する必要があります。場合によっては、プロセスを開始したユーザーがログアウトした後も、プロセスの実行を継続する必要があります。また、中断されたプロセスをユーザーが再開する手段も必要です。
次のセクションでは、Linux プロセスの構造について説明します。
4.1.2. プロセスの種類
4.1.2.1. 対話型プロセス
対話型プロセスは、ターミナルセッションを通じて初期化および制御されます。つまり、これらのプロセスを開始するには、システムに接続している誰かがいる必要があります。システム機能の一部として自動的に開始されるわけではありません。これらのプロセスはフォアグラウンドで実行され、プログラムを起動したターミナルを占有します。このプロセスがフォアグラウンドで実行されている間は、他のアプリケーションを起動することはできません。あるいは、バックグラウンドで実行され、プログラムを起動したターミナルは、プログラムの実行中に新しいコマンドを受け入れることができます。これまで、私たちは主にフォアグラウンドで実行されるプログラムに焦点を当ててきました。それらの実行時間はあまりにも短く、気づかないほどでした。しかし、 less コマンドは、ターミナルセッションを占有するコマンドの良い例です。この場合、起動されたプログラムは、何か操作を待機しています。プログラムは起動されたターミナルに接続されたままであり、ターミナルは、このプログラムが理解できるコマンドを入力するためだけに使用されます。他のコマンドはエラーになるか、
システムが応答しなくなる。
ただし、プロセスがバックグラウンドで実行されている間、ユーザーは、プログラムの実行中に、プログラムを開始した端末で他の操作を行うことができなくなります。
シェルには、 ジョブコントロール これにより、複数のプロセスを容易に処理できるようになります。この仕組みは、プロセスをフォアグラウンドとバックグラウンドの間で切り替えます。このシステムを利用することで、プログラムをバックグラウンドで即座に起動することも可能です。
プロセスをバックグラウンドで実行するのは、シェル経由のユーザー入力を必要としないプログラムにのみ有効です。ジョブをバックグラウンドで実行するのは、通常、ジョブの実行に長時間かかると予想される場合です。コマンド入力後にコマンドを発行した端末を解放するために、末尾にアンパサンドを追加します。この例では、グラフィカルモードを使用して、既存の端末ウィンドウとは別に別の端末ウィンドウを開きます。
ビリー:~> xterm &
[1] 26558
ビリー:~> jobs
[1]+ ランニング
xterm &
ビリー:~> xterm &
[1] 26558
ビリー:~> jobs
[1]+ ランニング
ジョブ制御機能の詳細については、 bash 情報ページなので、頻繁に使用されるジョブ制御アプリケーションのみがここにリストされます。
表4-1. 制御プロセス
コマンド(の一部) | 意味 |
通常コマンド | このコマンドをフォアグラウンドで実行します。 |
指図 & | このコマンドをバックグラウンドで実行します(ターミナルを解放します) |
jobs | バックグラウンドで実行されているコマンドを表示します。 |
Ctrlキー+Z | フォアグラウンドで実行中のプロセスを一時停止します (停止しますが、終了しません)。 |
Ctrlキー+C | フォアグラウンドで実行中のプロセスを中断 (終了) します。 |
%n | バックグラウンドで実行されているすべてのプロセスには番号が割り当てられます。%式を使用すると、ジョブを番号で参照できます。例えば、 fg %2. |
bg | バックグラウンドで一時停止されたプログラムを再アクティブ化します。 |
fg | ジョブをフォアグラウンドに戻します。 |
kill | プロセスを終了します(シェルの組み込みコマンドについては、 bash) |
より実践的な例は演習でご覧いただけます。
ほとんどのUNIXシステムは実行できる可能性が高い screenこれは、別のシェルでコマンドを実行したい場合に便利です。 screen指定されたシェルやコマンドを含む新しいセッションが作成されます。これらのセッションは、必要に応じて削除できます。この新しいセッションでは、好きなように操作できます。すべてのプログラムと操作は、発行元のシェルとは独立して実行されます。その後、このセッションを切り離すことができます。このセッションで起動したプログラムは、元のシェルからログアウトしても引き続き実行され、別のシェルに切り替えることができます。 screen いつでも再開できます。
このプログラムは、仮想コンソールがまだ発明されておらず、すべてを1つのテキスト端末で操作する必要があった時代に生まれました。Linuxでは仮想コンソールが登場してから10年近く経ちますが、中毒者にとっては今でも意味のあるものです。
4.1.2.2. 自動プロセス
自動プロセスまたはバッチプロセスは端末に接続されません。これらのタスクはスプーラ領域にキューイングされ、FIFO(先入先出)方式で実行されるまで待機します。これらのタスクは、以下の2つの基準のいずれかに基づいて実行されます。
• 特定の日時に: at コマンドについては、この章の後半で説明します。
• システム全体の負荷が十分に低く、追加のジョブを受け入れることができる場合: バッチ コマンドです。デフォルトでは、タスクはキューに入れられ、システム負荷が0.8未満になるまで実行を待機します。大規模環境では、大量のデータを処理する必要がある場合や、既に負荷がかかっているシステム上で多くのシステムリソースを必要とするタスクを実行する必要がある場合、システム管理者はバッチ処理を好む場合があります。バッチ処理は、システムパフォーマンスの最適化にも使用されます。
4.1.2.3. デーモン