\r\n\r\n
Linuxでフォアグラウンドとバックグラウンドのプロセスを管理するにはbashshellを使用します。Bashのジョブ制御関数やシグナルを利用することで、より柔軟にコマンドを実行することができます。その方法を紹介します。
LinuxやUnix系OSでプログラムが実行されると、必ずプロセスが開始されます。プロセス」とは、コンピュータのメモリ上で実行されるプログラムの内部表現の名称である。すべてのアクティブなプログラムには、プロセスがあります。実際、コンピュータ上で動作するほとんどすべてのものにはプロセスがあります。これには、GNOMEやKDEなどのグラフィカルデスクトップ環境(GDE)のコンポーネントや、ブート時に起動するシステムデーモンが含まれます。
なぜ、ほとんどすべてのものが動いているのか?Bashに内蔵されているcd、pwd、aliasはプロセスを起動(派生)せずに実行されます。bashはこれらのコマンドをターミナルウィンドウで実行されるbashshellのインスタンスで実行します。これらのコマンドは、実行するためにプロセスを開始する必要がないため、まさに高速である。(ターミナルウィンドウでhelpと入力すると、Bashの組み込みリストが表示されます)。
プロセスはフォアグラウンドで実行され、その場合、終了するまであなたのターミナルを引き継ぎますが、バックグラウンドで実行することも可能です。バックグラウンドで動作しているプロセスはターミナルウィンドウを制御しないので、ターミナルウィンドウで作業を続けることができます。少なくとも、画面出力を生成しないのであれば、端末のウィンドウを制御することはないでしょう。
これから簡単なpingトレースの実行を開始します。How to Geekのドメインにpingを打つことになります。フォアグラウンドプロセスとして実行されます。
ping www.tl80.cnターミナルウィンドウをスクロールして、期待通りの結果が得られました。pingは実行されており、ターミナルウィンドウで他のアクションを実行することはできません。コマンドを終了させるには、Ctrl+Cを押します。
Ctrl+Cスクリーンショットは、Ctrl+Cの目に見える効果を強調しています。 Pingは短いサマリーを表示し、その後ポーズをとります。
繰り返そう。しかし、今回はCtrl+Cではなく、Ctrl+Zを押すので、タスクは終了しません。これはバックグラウンドタスクになります。返ってくる端末のウィンドウを制御するのです。
ping www.tl80.cn Ctrl+ZCtrl+Zをクリックしたときの目に見える効果は、スクリーンショットで強調表示されています。
今度は「処理が止まっている」と言われた。停止は終了を意味するものではありません。信号待ちで停車している車と同じです。スクラップして捨てているわけではありません。まだ、道路に停車したまま、行く手を待っているのです。バックグラウンドで処理されるようになりました。
jobsコマンドは、現在のターミナル・セッションで開始されたジョブを一覧表示します。ジョブは(必然的に)プロセスなので、psコマンドで表示することも可能です。この2つのコマンドを使い、その出力を比較してみましょう。ここでは、Tオプション(ターミナル)を使って、このターミナルウィンドウで実行中のプロセスのみをリストアップすることにします。なお、hyphen-with-Tのオプションは必須ではありません。
jobs ps Tジョブズ・オーダーは次のように伝えています。
psコマンドでわかること
STAT列には、以下の値が一般的に使用される。
STAT欄の値の後には、以下のいずれかの指標を追加することができる。
BashのステータスがSsであることがわかります。 大文字のSは、Bashシェルがスリープ状態であり、割り込み可能であることを伝えています。必要なときにすぐ対応してくれる。小文字の "s "は、シェルがセッションの前身であることを物語っています。
pingコマンドのステータスがTであることから、ジョブ制御信号によりpingが停止したことがわかる。この例では、Ctrl+Zでバックグラウンドにしています。
ps TコマンドのステータスはRで、これは実行中であることを意味します。 +は、このプロセスがフォアグラウンドグループのメンバーであることを意味します。そのため、ps Tコマンドはフォアグラウンドで実行されています。
bgコマンドは、バックグラウンドプロセスの再開に使用されます。ジョブナンバーの有無に関わらず、使用することができます。ジョブ番号を指定せずに使用した場合、デフォルトのジョブが前面に表示されます。プロセスはバックグラウンドで実行されたままです。入力は一切送れません。
bgコマンドが発行された場合、pingコマンドを再開するのは
bgpingコマンドは継続され、再びターミナルウィンドウにスクロールする出力が表示されます。再起動されたコマンドの名前が表示されます。これはスクリーンショットで強調されています。
でも、問題があるんです。タスクはバックグラウンドで動作しており、入力を受け付けない。Ctrl+Cでは何もできない。私たちはそれをタイプして見ることができますが、バックグラウンドタスクはそのキーストロークを受け取らないので、楽しくpingを打ち続けることができるのです。
実は今、私たちは奇妙な混合モードに入っているのです。ターミナルウィンドウに入力することもできますが、pingコマンドのスクロール出力で、入力した内容はすぐに消去されます。私たちが入力したものは、早い段階で効果を発揮します。
バックグラウンドタスクを停止させるためには、フォアグラウンドにしてから停止させる必要があります。
fgコマンドは、バックグラウンドのタスクをフォアグラウンドにするコマンドです。bgコマンドと同様に、ジョブ番号の有無にかかわらず使用できます。ジョブ番号と一緒に使うことで、特定のジョブで動作することを意味します。ジョブ番号なしで使用した場合、最後にバックグラウンドに送信されたコマンドが使用されます。
fgと入力すると、pingコマンドが前面に出てきます。入力した文字はpingコマンドの出力と混在しているが、シェルは通常通りコマンドラインで入力したかのように動作する。実は、バッシュシェルから見ると、まさにこのような状態になっているのです。
fgこれで、pingコマンドが再びフォアグラウンドで実行されるようになったので、Ctrl+Cで終了させます。
Ctrl+Cもちろん、バックグラウンドでのプロセス実行は、出力を生成せず、入力を必要としない場合に最も効果的です。
しかし、紛らわしいかどうかは別として、この例では次のようなことが行われています。
Ctrl+CやCtrl+Zを使うときは、プロセスに信号を送っていることになります。これらは、killコマンドの短縮形です。killは64種類のシグナルを送ることができます。コマンドラインでkill-lを使用し、それらをリストアップします。これらの信号の発生源は、キルだけではありません。システム内の他のプロセスによって自動的に起動されるものもある
ここでは、一般的なものを紹介します。
キーの組み合わせが指定されていないことを知らせるために、killコマンドを使用しなければなりません。
Ctrl+Zでバックグラウンドに移行したプロセスを停止状態にした。bgコマンドで再起動させる必要があります。プログラムを実行中のバックグラウンドプロセスとして起動するのは簡単です。コマンドラインの末尾にwith記号を付加する。
バックグラウンドプロセスはターミナルウィンドウに書き込まない方が良いのですが、ここではそうする例で説明します。スクリーンショットの中に、参考になるものが必要です。このコマンドは、バックグラウンドプロセスとして無限ループを開始します。
and true; do echo "How To Geek Loop Process"; sleep 3; done&
ジョブ番号は1、プロセスIDは1979で、これらの識別子を使ってプロセスを制御します。
無限ループの出力がターミナルウィンドウに表示されるようになる。従来通り、コマンドラインを使用することもできますが、発行したコマンドはループ処理の出力とインターリーブされます。
長征
プロセスを停止させるには、jobsを使ってジョブ番号が何であるかを思い出し、killを使えばいい。
jobs はこのプロセスをジョブ番号 1 として報告します。 この番号を kill で使用するには、パーセント記号 % を前につける必要があります。
jobs kill %1killはプロセスにSIGTERMシグナル(シグナル番号15)を送り、プロセスを終了させる。次にEnterキーを押したとき、ジョブの状態が表示されます。プロセスが "終了 "と表示される。killコマンドに反応しない場合、プロセスを1レベル上げることができる。killは、シグナル番号9のSIGKILLと併用してください。 killコマンドとジョブ番号の間に9を入れます。
kill 9 %1関連:Linuxのターミナルからプロセスを終了させる方法