1. 概要

ご存知のように、実行中のプログラムは通常、入力を受け取り、それを処理して、適切な出力を提供します。 Linuxは、マルチタスクオペレーティングシステムとして、バックグラウンドおよびフォアグラウンドジョブとして多くのプロセス(基本的にはプログラムまたはコマンド)の実行をサポートします。

このチュートリアルでは、対話型プロセスと非対話型プロセスについて説明します。 また、Linuxでのジョブ制御とは何かを学びます。 また、コマンドラインからマルチタスクを実行する基本的な方法についても説明します。これは、時間のかかるプログラムを実行するときに必要なことです。

2. 相互作用とジョブ制御

ターミナルセッションは、対話型プロセスを初期化および制御します。 つまり、これらのプロセスを開始するには、システムに接続する人が必要です。 自動的には起動しません。 これらのプロセスはフォアグラウンドで実行できるため、プログラムを開始する端末を占有します。 このプロセスがフォアグラウンドで実行されている限り、他のアプリケーションを起動することはできません。

または、バックグラウンドで実行して、プログラムの実行中にプログラムを起動する端末が新しいコマンドを受け入れることができるようにすることもできます。 このような種類のプロセスは、非対話型プロセスとして知られています。 プロセスがバックグラウンドで実行されている間、ユーザーはターミナルで他のことを行うことができます。

シェルは、複数のプロセスを簡単に処理できるジョブ制御と呼ばれる機能を提供します。 このメカニズムは、バックグラウンドジョブとフォアグラウンドジョブの間でプロセスを切り替えます。 このシステムを使用すると、プログラムをバックグラウンドですぐに開始することもできます。

ジョブ制御は、プロセスまたはコマンドをフォアグラウンドとバックグラウンドの間で移動し、それらの実行を一時停止および再開する機能です。これを実装するために、bashはジョブの概念を導入します。これは本質的に1つ以上のコマンドです。プロセスが実行されます。

シェルは、ジョブ制御の実装でいくつかの単純なデータ構造を使用します。 プロセスID、状態、返されるステータスなど、子プロセスを表す構造があります。

3. バックグラウンドおよびフォアグラウンドジョブ

端末に接続するプロセスをフォアグラウンドジョブと呼びます。画面とキーボードを介してユーザーと通信できるため、ジョブはフォアグラウンドにあると言われます。

一方、端末から切断されてユーザーと通信できないプロセスは、バックグラウンドジョブと呼ばれます。 バックグラウンドジョブでユーザーとの対話が必要な場合、バックグラウンドジョブは停止し、端末への接続が確立されるまで待機します。

実行時にユーザーの操作を必要としないジョブ(大きなファイルの並べ替えなど)をバックグラウンドで配置できます。 これにより、ユーザーは長いジョブが終了するのを待たずに、ターミナルにアクセスして作業を続けることができます。

3.1. バックグラウンドでジョブを開始する

jobs コマンドを使用して、現在のシェルが呼び出したすべてのジョブリストすることができます。 シェルは、各ジョブのジョブID、ステータス(実行中、停止中、またはその他)、およびジョブを開始したコマンドを一覧表示します。 シェルは、最新のジョブを現在のジョブと見なし、プラス記号でマークします。

ジョブ制御に関連するコマンドは、現在のジョブに適用されます。 マイナス記号でマークされた他のすべてのジョブは、前のジョブです。 ジョブは、パーセント記号を使用してジョブIDで参照できます。 したがって、ジョブ1は%1と呼ばれ、ジョブ2は%2と呼ばれます。

バックグラウンドでジョブを配置するには、シェルコマンドの最後にアンパサンド文字(&)を追加するだけです。

「foo」というファイルを並べ替えて、結果を「bar」というファイルに配置するには、次のコマンドを発行します。

$ sort < foo > bar &

3.2. フォアグラウンドジョブの一時停止

Ctrl-Zを入力することで、(通常)Linuxに現在端末に接続されているジョブを一時停止するように指示できます。シェルはプロセスが一時停止されたことを通知し、一時停止されたジョブを割り当てます。ジョブID。

一時停止されたジョブとバックグラウンドで実行されているジョブには大きな違いがあります。 一時停止されたジョブが停止されると、フォアグラウンドまたはバックグラウンドで実行されるまで、そのジョブの処理は行われません。

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

フォアグラウンドでジョブを開始し、それをバックグラウンドに配置したい場合、最初に行うことは、Ctrl-Zを使用してジョブを一時停止することです。これにより、ターミナルが解放されます。

$ tail -f temp.log
^Z[1]+  Stopped                    tail -f temp.log

次に、コマンド bg を発行して、中断されたジョブをバックグラウンドに配置できます。

$ bg
[1] tail -f temp.log
$ jobs
[1]+  Running                    tail -f temp.log

bg コマンドは、引数としてジョブIDを受け入れることができます。 ジョブIDが指定されていない場合、 bg は、現在の(中断されている)ジョブを参照していると見なします。

3.4. バックグラウンドジョブをフォアグラウンドに持ち込む

Linuxコマンドfgを使用して、バックグラウンドジョブを端末に再接続できます。

fg コマンドは、引数としてジョブIDを受け入れます。 パーセント記号を必ず含めてください。

$ fg %2

このコマンドは、ジョブ2をフォアグラウンドに移動します。 ジョブIDが指定されていない場合、 fg は、現在の(一時停止中の)ジョブを参照していると見なします。

3.5. 中断されたジョブの開始

実行を再開したい中断されたジョブがある場合は、最初に、フォアグラウンドで実行するかバックグラウンドで実行するかを決定する必要があります。 jobsコマンドで中断されたジョブのジョブIDを見つけたら、bg(バックグラウンドでジョブを実行するため)またはfg(フォアグラウンドでジョブを実行するため)を使用できます。

4. 信号

シグナルは、実行中のプログラムに送信される標準化されたメッセージであり、終了やエラー処理などの特定の動作をトリガーします。 シグナルの一般的な使用法は、プロセスを一時停止、終了、または強制終了することです。

Ctrl-Zを使用してバックグラウンドプロセスの実行を一時停止できます。これにより、シグナルSIGTSTPが送信されます。

$ tail -f temp.log 
^Z[1]+ Stopped tail -f temp.log 
$ jobs
[1]+ Stopped tail -f temp.log

バックグラウンドプロセスをフォアグラウンドに送信し、Ctrl-Cで終了すると、シグナルSIGINTが送信されます。

もちろん、これらのLinuxコントロールを使用して、プロセスの実行を停止または終了することができます。 ただし、バックグラウンドプロセスを終了するためのより直接的なアプローチは、killコマンドを使用することです。 ジョブIDは使用せず、代わりにPIDを使用します。 The -9を殺すコマンドは、対応するプロセスを終了します :

$ jobs
[1]+  Running                    tail -f temp.log
$ kill -9 97
[1]+  Killed                     tail -f temp.log

デフォルトでは、killコマンドはkill信号SIGKILLを即座に終了します。

Ctrl-Zと同様に、killを使用して、プロセスの一時停止信号である停止信号SIGSTOPを送信することもできます

jobs
[1]+  Running                    tail -f temp.log
$ kill -19 152
[1]+  Stopped (signal)           tail -f temp.log
$ jobs
[1]+  Stopped (signal)           tail -f temp.log

5. 結論

この記事では、Linuxのインタラクティブプロセスと非インタラクティブプロセスについて理解しました。 また、フォアグラウンドプロセスとバックグラウンドプロセスで実行できる操作のいくつかについても説明しました。 同じコンテキストで、カーネルが送信する一般的なLinuxコマンドとコントロールのいくつかに対応するさまざまなシグナルも学習しました。