\r\n\r\n
プロセスという言葉は、コンピュータサイエンスの知識がない人には通常なじみがない。しかし、Linuxのプログラミングを論じるときによく使われ、システム管理業務には欠かせないプロセスである。
Linuxでも、非常によく似た概念を指す言葉としてjobという言葉が使われています。この2つの違いは微妙ですが重要で、ジョブ制御はマルチタスク環境を運用する際に便利なツールです。ジョブを処理するために使用できるツールやビルトインコマンドはたくさんあります。
最も単純なレベルでは、プロセスは実行するプログラムに相当すると考えることができます。ウェブブラウザのような本格的なGUIアプリケーションである可能性もあります。大まかに言えば、コンピュータで起こることはすべて、その中核にあるプロセスに依存しているのです。
実際には、1つのアプリケーションが複数のプロセスを使用して、異なるタスクを同時に実行することができます。パイプラインを使用したコマンドライン呼び出し、例.
$ grep "error" log.txt | wc -lパイプセグメントごとに2つの独立したプロセスが実行されます。
プロセスは、ユーザーが明示的に作成する場合と、コンピュータ自身が自動的に作成する場合があり、実際、一度起動すると、すでに数百のプロセスが実行されていることもある。
プロセスは他のプロセスを派生させることができ、initは多くの伝統的なLinuxシステムで最初に起動するプロセスで、実行中のすべてのプロセスの起動に最終的に責任を負います。
多くのプロセスは、タスクを実行して停止する短いコマンドです。ターミナルで ls と入力すると、数秒のうちにプロセスが開始、実行、停止します。
一部のプロセス(デーモンなど)は継続的に実行されます。たとえば、cronプロセスは、そのホストが実行されている間、定期的に他のコマンドを実行します。
オペレーティングシステム(OS)は、各プロセスに一意の識別子を割り当てている。この値は通常1〜5桁の数字で、将来のプロセスは、完全にクリーンアップされた以前のプロセスのPIDを再利用することができます。
オペレーティングシステム自身は、さまざまな方法でPIDを使用しています。良い例としては、現在実行中のプロセスに関する情報を保存する/procディレクトリがあります。
関連:Linuxのルートディレクトリにあるフォルダーは何ですか?
Linuxの用語では、ジョブはシェルによって管理されるプログラムです。通常、1つのプロセスで構成されるが、複数のプロセスを使用することもある。ターミナルにコマンドを入力すると、そのコマンドを実行するためのプロセスが生成され、その実行中のコマンドを制御するためのジョブが作成されます。
フォアグラウンドで実行中のジョブは、Control+C(^C)キーで中断することができます。これにより、通常はプロセスが終了し、端末がプロンプトに戻ります。
$ sleep 100^C$また、Control+Z(^Z)を押しても、ジョブの実行は停止しますが、終了することはありません。
$ sleep 100^Z[1]+ Stopped sleep 100$なお、ジョブを停止する際には、シェルが角括弧でジョブ番号を教えてくれます。他のコマンドと組み合わせて、ジョブの制御**を行うことができます。例えば、fgでフォアグラウンドにすることで、ジョブを再起動させることができます。
$ fg %1sleep 100同様のコマンドで、バックグラウンドでジョブを再開することができます。
$ bg %1[1]+ sleep 100 &$これにより、コントロールがプロンプトに戻り、ジョブ実行中に他の作業を続けることができます。ジョブを起動したらすぐにバックグラウンドで実行させたい場合は、コマンドの最後に(&T)を付けます:。
$ sleep 100 &[1] 61087$この例では、シェルはジョブ番号を括弧内に表示し、次にPIDを表示します。
プロセスに関する情報を得るための最も便利なコマンドの1つがtopである。このプログラムは、実行中のプロセスをリアルタイムで対話的に表示する。GNOME の System Monitor や Windows の Task Manager などのグラフィカルなプログラムのコマンドライン版に相当するものです。
シンプルなコマンドtopでOKです。
ヘッダー部には、CPU負荷とメモリ使用量が表示されます。以下、topは1行に1つのプロセスを含むテーブルを示す。詳細には、PID、プロセスが使用している有効なCPUパワー、消費しているCPU時間の合計が含まれます。情報は自動的に更新され、デフォルトでは3秒ごとに更新されます。
top の動作を変更するために使用できるオプションや対話型コマンドは数多くある。
psコマンドは、プロセスステータスの略で、プロセスの一覧を表示するコマンドです。さまざまなオプションにより、表示される詳細情報にさまざまなフィルターや調整を行うことができます。デフォルトでは、psはターミナルにアタッチされ、現在のユーザーによって起動されたプロセスを表示します。つまり、ほとんどのコマンドは、コマンドラインで入力するものなのです。
前のタスクがまだバックグラウンドにある状態で、出力は次のようになります。
$ psPID TTY TIME CMD35564 ttys000 0:00.00 sleep 10073998 ttys000 0:00.43 -bashtop と同様、ps にはその動作を制御するためのオプションがいくつかあり、それらは以下の man ps で確認することができる。
最も便利なのは -e と -f で、それぞれユーザが所有するすべてのプロセスと 追加のカラムを表示することができます。
$ ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 2020 ? 00:11:22 /**in/initroot 2 0 0 2020 ? 00:00:00 [kthreadd]...Jobsコマンドは,現在のシェルのバックグラウンドジョブを一覧表示します.
$ du -skh ~ >/tmp/du.txt 2>/dev/null &[1] 61167このコマンドは、ホームディレクトリが使用しているディスク容量の合計を計算し、その出力を一時ファイルにリダイレクトします。
$ jobs[1]+ Running du -skh ~ > /tmp/du.txt 2> /dev/null &やがて、ジョブが完了すると、ターミナルに次のような行が表示されます。
[1]+ Exit 1 du -skh ~ > /tmp/du.txt 2> /dev/null誤動作しているプロセスを見つけた場合、そのプロセスを終了させる必要がある場合があります。過激に聞こえるかもしれませんが、killコマンドはシステム管理者のツールボックスの正常な一部です。プロセスの動作を制御するための標準的な通知であるいくつかのシグナルのうち、任意の1つを送信することができます。一般的に送信する信号には、SIGINT、SIGTSTP、SIGTERM、SIGKILLがあります。
SIGINTは^Cを、SIGTSTPは^Zを押すのと同じである。 SIGTERMとSIGKILLは、どちらもプロセスを停止させる方法である。前者は、プロセスにリクエストを送信し、プロセスを優雅に停止させる機会を与える。後者は、プロセスを強制終了させるより極端な方法であり、最後の手段として使用されるべきものです。
killコマンドは、ジョブにも使えます。
$ jobs[1]+ Running sleep 100 &$ kill %1[1]+ Terminated: 15 sleep 100続きを読む: Linuxで応答しないプログラムを強制終了する方法
プロセスとジョブは、特にその違いを理解するのが難しい概念です。しかし、これらはLinuxでのシステム管理を理解するための最初のステップとなります。ジョブとは、シェルから異なるコマンドを同時に実行するための実用的な方法です。
プロセスとは、**indulgentでもある低レベルの概念で、コンピュータ上で動作するすべてのプログラムの核となるものである。