\r\n\r\n

Linuxでバックグラウンドプロセスを実行・制御する方法

Linuxでbashshellを使用して、フォアグラウンドとバックグラウンドのプロセスを管理します。bashのジョブ制御関数やシグナルを利用することで、より柔軟にコマンドを実行することができます。その方法を紹介します...

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+Z

Ctrl+Zをクリックしたときの目に見える効果は、スクリーンショットで強調表示されています。

今度は「処理が止まっている」と言われた。停止は終了を意味するものではありません。信号待ちで停車している車と同じです。スクラップして捨てているわけではありません。まだ、道路に停車したまま、行く手を待っているのです。バックグラウンドで処理されるようになりました。

jobsコマンドは、現在のターミナル・セッションで開始されたジョブを一覧表示します。ジョブは(必然的に)プロセスなので、psコマンドで表示することも可能です。この2つのコマンドを使い、その出力を比較してみましょう。ここでは、Tオプション(ターミナル)を使って、このターミナルウィンドウで実行中のプロセスのみをリストアップすることにします。なお、hyphen-with-Tのオプションは必須ではありません。

jobs ps T

ジョブズ・オーダーは次のように伝えています。

  • [1】:角括弧内の数字はジョブ番号で、ジョブ制御コマンドで制御する際にジョブを参照するのに使用します。
  • +プラス記号+は、特定のジョブ番号を持たないジョブ制御コマンドを使用した場合、そのジョブに対する操作を実行することを示します。デフォルトジョブと呼ばれるものです。デフォルトのジョブは、常にジョブリストに追加された直近のジョブです。
  • 停止中:プロセスは実行中ではありません。
  • トントンと音を立てる www.tl80.cn: 処理を開始するためのコマンドラインです。

psコマンドでわかること

  • PID: プロセスのID。各プロセスは一意のIDを持っている。
  • TTY:実行プロセス用の擬似テレタイプライタ(端末ウィンドウ)。
  • STAT: プロセスの状態。
  • Time: プロセスが消費したCPU時間の量。
  • コマンド:処理を開始するためのコマンド。

STAT列には、以下の値が一般的に使用される。

  • D: 遮断されないスリープ。プロセスは、通常、入力または出力のために待機状態にあり、割り込むことはできない。
  • I:アイドル。
  • R:走ること。
  • S:睡眠が妨げられることがある。
  • T:ジョブ制御信号で停止。
  • Z:ゾンビプログラム。プロセスは終了したが、親プロセスによってまだ「クリーニング」されていない。

STAT欄の値の後には、以下のいずれかの指標を追加することができる。

  • <: 優先度の高いタスク(他のプロセスに悪影響を与える)
  • N:低優先度(他のプロセスで使用するのに適している)
  • L: プロセスがページをメモリにロックする(通常、リアルタイムプロセスで使用される)。
  • 生徒:セッションリーダー。セッションリーダーは、プロセスグループのプロセスを開始する人である。
  • l:マルチスレッドプロセス。
  • +:フォアグラウンドプロセス。

BashのステータスがSsであることがわかります。 大文字のSは、Bashシェルがスリープ状態であり、割り込み可能であることを伝えています。必要なときにすぐ対応してくれる。小文字の "s "は、シェルがセッションの前身であることを物語っています。

pingコマンドのステータスがTであることから、ジョブ制御信号によりpingが停止したことがわかる。この例では、Ctrl+Zでバックグラウンドにしています。

ps TコマンドのステータスはRで、これは実行中であることを意味します。 +は、このプロセスがフォアグラウンドグループのメンバーであることを意味します。そのため、ps Tコマンドはフォアグラウンドで実行されています。

BGコマンド

bgコマンドは、バックグラウンドプロセスの再開に使用されます。ジョブナンバーの有無に関わらず、使用することができます。ジョブ番号を指定せずに使用した場合、デフォルトのジョブが前面に表示されます。プロセスはバックグラウンドで実行されたままです。入力は一切送れません。

bgコマンドが発行された場合、pingコマンドを再開するのは

bg

pingコマンドは継続され、再びターミナルウィンドウにスクロールする出力が表示されます。再起動されたコマンドの名前が表示されます。これはスクリーンショットで強調されています。

でも、問題があるんです。タスクはバックグラウンドで動作しており、入力を受け付けない。Ctrl+Cでは何もできない。私たちはそれをタイプして見ることができますが、バックグラウンドタスクはそのキーストロークを受け取らないので、楽しくpingを打ち続けることができるのです。

実は今、私たちは奇妙な混合モードに入っているのです。ターミナルウィンドウに入力することもできますが、pingコマンドのスクロール出力で、入力した内容はすぐに消去されます。私たちが入力したものは、早い段階で効果を発揮します。

バックグラウンドタスクを停止させるためには、フォアグラウンドにしてから停止させる必要があります。

fgコマンド

fgコマンドは、バックグラウンドのタスクをフォアグラウンドにするコマンドです。bgコマンドと同様に、ジョブ番号の有無にかかわらず使用できます。ジョブ番号と一緒に使うことで、特定のジョブで動作することを意味します。ジョブ番号なしで使用した場合、最後にバックグラウンドに送信されたコマンドが使用されます。

fgと入力すると、pingコマンドが前面に出てきます。入力した文字はpingコマンドの出力と混在しているが、シェルは通常通りコマンドラインで入力したかのように動作する。実は、バッシュシェルから見ると、まさにこのような状態になっているのです。

fg

これで、pingコマンドが再びフォアグラウンドで実行されるようになったので、Ctrl+Cで終了させます。

Ctrl+C

正しいシグナルを発信することが必要

もちろん、バックグラウンドでのプロセス実行は、出力を生成せず、入力を必要としない場合に最も効果的です。

しかし、紛らわしいかどうかは別として、この例では次のようなことが行われています。

  • プロセスをバックグラウンドに入れる
  • プロセスをバックグラウンドで実行状態に戻す。
  • プロセスをフォアグラウンドに戻す。
  • プロセスを終了しています。

Ctrl+CやCtrl+Zを使うときは、プロセスに信号を送っていることになります。これらは、killコマンドの短縮形です。killは64種類のシグナルを送ることができます。コマンドラインでkill-lを使用し、それらをリストアップします。これらの信号の発生源は、キルだけではありません。システム内の他のプロセスによって自動的に起動されるものもある

ここでは、一般的なものを紹介します。

  • 信号1.は、実行中の端末が閉じられると、自動的にプロセスに送られます。
  • シグナル:Ctrl+Cを押したプロセスに送られるシグナル2.プロセスを中断し、終了するように指示する。
  • 信号3.は、ユーザーが終了信号Ctrl+Dを送った場合、プロセスに送られる。
  • シグナル9.プロセスは即座に終了し、クリーンシャットダウンは試みられない。
  • 信号の終了:信号15。これはkillが送るデフォルトの信号で、標準的なプログラムの終了信号である。
  • SIGTSTP:シグナル20。Ctrl+Zを使用したときにプロセスに送られる。プロセスを停止してバックグラウンドにする。

キーの組み合わせが指定されていないことを知らせるために、killコマンドを使用しなければなりません。

さらなる運用管理

Ctrl+Zでバックグラウンドに移行したプロセスを停止状態にした。bgコマンドで再起動させる必要があります。プログラムを実行中のバックグラウンドプロセスとして起動するのは簡単です。コマンドラインの末尾にwith記号を付加する。

バックグラウンドプロセスはターミナルウィンドウに書き込まない方が良いのですが、ここではそうする例で説明します。スクリーンショットの中に、参考になるものが必要です。このコマンドは、バックグラウンドプロセスとして無限ループを開始します。

and true; do echo "How To Geek Loop Process"; sleep 3; done&amp;

ジョブ番号は1、プロセスIDは1979で、これらの識別子を使ってプロセスを制御します。

無限ループの出力がターミナルウィンドウに表示されるようになる。従来通り、コマンドラインを使用することもできますが、発行したコマンドはループ処理の出力とインターリーブされます。

長征

プロセスを停止させるには、jobsを使ってジョブ番号が何であるかを思い出し、killを使えばいい。

jobs はこのプロセスをジョブ番号 1 として報告します。 この番号を kill で使用するには、パーセント記号 % を前につける必要があります。

jobs kill %1

killはプロセスにSIGTERMシグナル(シグナル番号15)を送り、プロセスを終了させる。次にEnterキーを押したとき、ジョブの状態が表示されます。プロセスが "終了 "と表示される。killコマンドに反応しない場合、プロセスを1レベル上げることができる。killは、シグナル番号9のSIGKILLと併用してください。 killコマンドとジョブ番号の間に9を入れます。

kill 9 %1

議論してきたこと

  • Ctrl+C: プロセスが入力を受け取っている場合、SIGINT(シグナル2)を送り、終了を指示します。
  • Ctrl+D: SISQUIT, シグナル3, プロセスが入力を受けている場合に送られ、終了を指示する。
  • Ctrl+Z:プロセスにSIGSTP(シグナル20)を送り、停止(ハング)してバックグラウンド・プロセスになるように指示します。
  • アサインメント:バックグラウンドのアサインメントを一覧表示し、アサインメント番号を表示します。
  • bg job number: バックグラウンドプロセスを再開します。job numberが提供されない場合、バックグラウンドタスクに変換された最後のプロセスが使用されます。
  • fg job\ u number: バックグラウンドのプロセスをフォアグラウンドにし、再起動させる。ジョブ番号が提供されない場合、バックグラウンドタスクに変換された最後のプロセスが使用されます。
  • commandline&: 実行中のバックグラウンドタスクとしてコマンドラインの末尾に&を追加し、コマンドを実行します。
  • kill%jobu number:プロセスにSIGTERMシグナル15を送信して終了させる。
  • kill 9jobu number: SIGKILL(シグナル 9)をプロセスに送信して、そのプロセスを突然終了させる。

関連:Linuxのターミナルからプロセスを終了させる方法

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ