」、Linuxシステム、およびターミナルがどのように連携してプロセスとジョブの制御を提供するかについて説明します。`コマンドを使用して、システム上のプロセスを制御できます。この記事では、フォアグラウンドプロセスとバックグラウンドプロセスの管理に焦点を当て、シェルのジョブ制御機能を活用してコマンドの実行方法の柔軟性を高める方法を示します。前景プロセスの管理Linuxマシンで開始するほとんどのプロセスはフォアグラウンドで実行されます。このコマンドは実行を開始し、プロセスの間シェルの使用をブロックします。プロセスは、ユーザーとの対話を許可する場合もあれば、単にプロシージャを実行して終了する場合もあります。デフォルトでは、出力は端末ウィンドウに表示されます。フォアグラウンドプロセスを管理する基本的な方法を以下で説明します。プロセスを開始するデフォルトでは、プロセスはフォアグラウンドで開始されます。プログラムが終了するか状態を変更するまで、シェルと対話することはできません。一部のフォアグラウンドコマンドは非常に迅速に終了し、すぐにシェルプロンプトに戻ります。World」が端末に出力され、コマンドプロンプトに戻ります。他のフォアグラウンドコマンドは実行に時間がかかり、その間シェルアクセスをブロックします。これは、コマンドがより広範な操作を実行しているため、または明示的に停止されるまで、または他のユーザー入力を受け取るまで実行するように構成されているためです。+`ユーティリティです。開始後、ユーザーがプロセスを終了するまで実行を継続し、表示を更新します。top「q」と入力して終了できます。一部のプロセスには専用の終了機能がありません。それらを停止するには、別の方法を使用する必要があります。+`ループを開始するとします。World」を出力するループを開始できます。このループは、明示的に終了するまで永遠に続きます。doneループには「終了」キーはありません。*を送信してプロセスを停止する必要があります。Linuxでは、カーネルはプロセスのシグナルを送信して、プロセスの終了または状態の変更を要求できます。+」キーの組み合わせが押されたときに「SIGINT」シグナル(通常、シグナル番号2)を現在のフォアグラウンドプロセスに送信するように構成されます。SIGINTシグナルは、ユーザーがキーボードを使用して終了を要求したことをプログラムに伝えます。開始したループを停止するには、コントロールキーを押しながら「c」キーを押します。CTRL-Cループが終了し、制御がシェルに戻ります。`の組み合わせによって送信されるSIGINTシグナルは、プログラムに送信できる多くのシグナルの1つです。+`コマンドを使用して送信する必要があります(これについては後で説明します)。前に述べたように、フォアグラウンドプロセスは実行中はシェルへのアクセスをブロックします。フォアグラウンドでプロセスを開始した後、ターミナルにアクセスする必要があることに気付いた場合はどうなりますか?送信できるもう1つの信号は、「SIGTSTP」信号(通常、信号番号20)です。+」を押すと、ターミナルは「サスペンド」コマンドを登録し、SIGTSTPシグナルをフォアグラウンドプロセスに送信します。これは基本的にコマンドの実行を一時停止し、制御を端末に返します。」を使用してgoogle.comに接続します。command`を追加します。これにより、コマンドで人為的に最大カウントを設定するシェルエイリアスをバイパスできます。+`と入力します:CTRL-Z次のような出力が表示されます。`コマンドは一時的に停止され、シェルプロンプトに再びアクセスできるようになりました。+`プロセスツールを使用できます。`プロセスはまだリストされていますが、「STAT」列には「T」が含まれていることがわかります。+`のマニュアルページは、これが「(a)ジョブ制御信号によって停止された」ジョブを表していることを示しています。プロセスの状態を変更する方法について詳しく説明しますが、今のところ、次のように入力して、フォアグラウンドでコマンドの実行を再開できます。+`で終了します:CTRL-Cバックグラウンドプロセスの管理フォアグラウンドでプロセスを実行する主な代替方法は、バックグラウンドで実行できるようにすることです。バックグラウンドプロセスは、それを開始した特定の端末に関連付けられていますが、シェルへのアクセスをブロックしません。代わりに、バックグラウンドで実行され、コマンドの実行中にユーザーがシステムと対話できるようにします。フォアグラウンドプロセスがそのターミナルと対話する方法のために、すべてのターミナルウィンドウに対して1つのフォアグラウンドプロセスしか存在できません。バックグラウンドプロセスは、プロセスの完了を待たずにすぐに制御をシェルに返すため、多くのバックグラウンドプロセスを同時に実行できます。開始プロセスコマンドの最後にアンパサンド文字(「&」)を追加することにより、バックグラウンドプロセスを開始できます。これにより、プロセスが完了するのを待たずに、実行を開始してすぐにユーザーをプロンプトに戻すようシェルに指示します。コマンドの出力は引き続き端末に表示されます(https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-io-redirection[redirected]を除く)が、次のように追加のコマンドを入力できます。バックグラウンドプロセスが続行されます。次のように入力して、バックグラウンドの最後のセクションから同じpingプロセスを開始できます。+`ジョブ制御システムからの出力が表示されます。msただし、コマンドを同時に入力することもできます。バックグラウンドプロセスの出力は、フォアグラウンドプロセスの入力と出力に混在しますが、フォアグラウンドプロセスの実行を妨げることはありません。+`コマンドを使用できます。+」コマンドを実行している場合、次のようなものが表示されます。&これは、現在1つのバックグラウンドプロセスが実行されていることを示しています。`はコマンドの「ジョブ仕様」またはジョブ番号を表します。」などの他のジョブおよびプロセス制御コマンドで参照できます。バックグラウンドプロセスの停止いくつかの方法で現在のバックグラウンドプロセスを停止できます。+`コマンドを使用することです。次のように入力して、実行中のバックグラウンドプロセスを強制終了できます。%1端末の設定方法に応じて、すぐに、または次にEnterキーを押すと、ジョブの終了ステータスが表示されます。jobs`コマンドをもう一度チェックすると、現在のジョブは表示されません。プロセス状態の変更バックグラウンドでプロセスを開始および停止する方法がわかったので、プロセスの状態を変更する方法について説明できます。+`でプロセスを停止または一時停止する方法を説明したときに、1つの状態変化を示しました。プロセスがこの停止状態にある場合、フォアグラウンドプロセスをバックグラウンドに移動したり、その逆を行うことができます。`&`でコマンドを終了することを忘れても、プロセスをバックグラウンドに移動できます。+`コマンドを使用してバックグラウンドでプロセスを再開できます。bgジョブのステータス行が再び表示されますが、今回はアンパサンドが追加されています。+`コマンドは最後に停止したプロセスで動作します。再起動せずに連続して複数のプロセスを停止した場合は、ジョブ番号でプロセスを参照して、正しいプロセスをバックグラウンドにできます。すべてのコマンドをバックグラウンド化できるわけではないことに注意してください。一部のプロセスは、アクティブな端末に直接接続された標準入出力で開始されたことを検出すると、自動的に終了します。+`を入力して、バックグラウンドプロセスをフォアグラウンドに移動することもできます。`出力の「」で示される)で動作します。プロセスを直ちに中断し、フォアグラウンドに配置します。別のジョブを指定するには、そのジョブ番号を使用します。+`でジョブを強制終了するか、完了させるか、中断してバックグラウンドに戻すことができます。SIGHUPの取り扱いプロセスがバックグラウンドであるかフォアグラウンドであるかに関係なく、プロセスを開始したターミナルインスタンスとかなり密接に結びついています。端末が閉じると、通常、端末に関連付けられているすべてのプロセス(フォアグラウンド、バックグラウンド、または停止)にSIGHUPシグナルを送信します。これは、制御端末がまもなく利用できなくなるため、プロセスが終了することを通知します。ターミナルを閉じてもバックグラウンドプロセスを実行したい場合はどうしますか?これを実現する方法はいくつかあります。これは常にオプションとは限りません。これらのプログラムが利用できない場合や、実行を継続するために必要なプロセスを既に開始している場合があります。時々、これらはあなたが達成する必要があるものに対しては行き過ぎです。+`コマンドを使用してターミナルを開始できます。これにより、開始されたプロセスはSIGHUPシグナルの影響を受けなくなります。ターミナルが閉じても実行を継続します。これは、initシステムの子として再割り当てされます。+`という名前のファイル(書き込み可能な場合は現在のディレクトリ、そうでない場合はホームディレクトリ)に書き込まれることを示します。‘nohup.out’これは、ターミナルウィンドウが閉じられた場合に出力が失われないようにするためです。ターミナルウィンドウを閉じて別のウィンドウを開いても、プロセスは実行されたままです。+`コマンドの出力には表示されません。_job_が破壊されました。`プロセスを強制終了するには、そのプロセスID(または「PID」)を検索する必要があります。`コマンドもありますが、この2つの部分からなるメソッドは、目的のプロセスのみを強制終了することを保証します)。+`フラグを使用して、実行可能ファイルを検索します。google.comその後、返されたPID(最初の列の数値)を参照することにより、プロセスを強制終了できます。+`ファイルを削除できます。`コマンドは役立ちますが、プロセスを開始するときに必要になることがわかっている場合のみです。+`で同様の結果を達成する他の方法を提供します。`コマンドは、デフォルト設定では、ターミナルのジョブキューからジョブを削除します。」など)を使用して管理することはできなくなります。+`出力のリストからすぐに削除され、端末に関連付けられなくなります。コマンドは、ジョブ番号を指定して呼び出されます。ジョブ2をすぐに否認するには、次のように入力します。+」プロセスの状態とは異なる状態になります。例外は、制御端末がファイルにリダイレクトされていない場合、制御端末を閉じると出力が失われることです。通常、端末ウィンドウをすぐに閉じない場合、ジョブ制御からプロセスを完全に削除することは望ましくありません。+`プロセスに渡すことができますが、そうでなければ通常のジョブとして続行します。%1この状態では、通常のジョブ制御メカニズムを使用して、ターミナルを閉じるまでプロセスの制御を続けることができます。ターミナルを閉じると、起動時にファイルにリダイレクトしなかった場合、再び出力する場所がないプロセスでスタックします。この問題を回避するには、プロセスが既に実行された後に、プロセスの出力をリダイレクトしてみてください。[この投稿]をご覧ください。やってそれをするかを知るために。huponexitシェルオプションの使用Bashには、子プロセスのSIGHUP問題を回避する別の方法もあります。+`シェルオプションは、bashが終了時に子プロセスにSIGHUPシグナルを送信するかどうかを制御します。+`オプションはおそらく最も簡単なオプションの1つです。次のように入力して、この機能がオンかオフかを確認できます。huponexitオンにするには、次を入力します。+」と入力してセッションを終了すると、すべてのプロセスが引き続き実行されます。exitこれには最後のオプションと同じプログラム出力に関する警告があるため、端末を閉じる前に重要な場合はプロセスの出力をリダイレクトしてください。結論ジョブ制御と、フォアグラウンドプロセスとバックグラウンドプロセスの管理方法を学習すると、コマンドラインでプログラムを実行する際の柔軟性が高まります。多くのターミナルウィンドウまたはSSHセッションを開く必要はなく、多くの場合、いくつかの停止コマンドとバックグラウンドコマンドで対応できます。