バックエンドの仕事はどこに行きましたか?

バックエンドの仕事はどこに行きましたか?

私はgnome-terminalを介してCzを使用してタスクを一時停止してからバックグラウンドで送信できることを知っています。端末を閉じてもプロセスは終了しません。タスクはどこで管理されますか、それとも失われますか?

答え1

バックグラウンドジョブは、誰かがシグナルを送信して停止するように指示されるまで実行され続けます。死の方法は次のとおりです。

  • 何らかの理由で端末が離れると、HUP信号(モデムの切断のように「切断」)その中で実行されるシェルに(より正確には制御プロセス)そしてその過程フォアグラウンドプロセスグループ。したがって、バックグラウンドで実行されるプログラムは影響を受けませんが...
  • シェルはこのHUP信号を受信すると、それをバックグラウンドジョブに伝播します。したがって、バックグラウンドプロセスが信号を無視しない場合、この時点で終了します。
  • 端末が消えた後にプログラムが端末から読み取りまたは書き込みを試みると、入出力エラー(EIO)が原因で読み取りまたは書き込みが失敗します。これにより、プログラムが終了することを決定できます。
  • もちろん、あなた(またはあなたのシステム管理者)はいつでもプログラムを終了することを決めることができます。

プログラムを実行し続けることが問題である場合は、次の手順を実行してください。

  • プログラムが端末と対話できる場合は、次を使用します。画面またはマルチプレクサ仮想端末でプログラムを実行すると、勝手に接続を切断して再接続できます。
  • プログラムを実行し続ける必要があり、対話型でない場合は、nohupコマンド(nohup myprogram --option somearg)を使用してプログラムを開始します。このコマンドは、シェルがSIGHUPを送信せずに標準入力を名前付きファイルにリダイレクト/dev/nullし、標準出力と標準エラーをDirectedにリダイレクトします。 nohup.out.
  • プログラムを起動して端末を閉じたときにプログラムを終了したくない場合は、組み込みdisownプログラムを実行してください(シェルに組み込み機能がある場合)。そうでない場合は、SIGHUPを伝播するシェルを回避するために、極端な偏りでシェルをシャットダウンすることができます(シェル内の指定されたプロセスの終了kill -KILL $$トリガーをバイパスします)。
  • すでにプログラムを実行していて他の端末に再接続したい場合は、いくつかの方法がありますが、100%信頼できません。バラより実行中のプロセスを拒否し、それを新しいスクリーンシェルに接続する方法は?そして関連する問題。

答え2

kill適切な信号(コマンドを使用)を送信することで、操作をさらに制御できます。

次のことを試すことができます。

  • いくつかの長期実行コマンドを実行します(yesたとえば、出力でプロセスが実行されていることがわかります)。
  • ~によるとCtrl + Z
  • プロセスPIDを決定します。pgrep yes
  • プロセス(bgまたはと同じfg)を復元するには、次のようにします。ここで、前のステップで決定されたプロセスIDはkill -CONT <PID>何ですか? <PID>

答え3

Ctrl+を押すと、Zプロセスはバックグラウンドに送信されず、スリープモードになります。fgコマンド(前景)を使用して目覚めさせることができます。 +プロセスにCtrl(19)信号をZ送信します。SIGSTOP

以下を証明できます。

  • 2つの端末を開き、そのうちの1つにこのコマンドを入力すると、端末にyes running「running」「running」「running」が繰り返し印刷されます。
  • CtrlZ- を使用すると、このコマンドを使用してプロセスを停止し、そのPIDを見つけることができますps
  • 2番目の端末タイプでは、kill -19 the_previous_PID「yes」プロセスに同じ効果があることがわかります。

入力すると、kill -l利用可能なすべての信号のリストが表示されます。

関連情報