私はgnome-terminalを介してCzを使用してタスクを一時停止してからバックグラウンドで送信できることを知っています。端末を閉じてもプロセスは終了しません。タスクはどこで管理されますか、それとも失われますか?
ベストアンサー1
バックグラウンドジョブは、誰かがシグナルを送信して停止するように指示されるまで実行され続けます。死の方法は次のとおりです。
- 何らかの理由で端末が離れると、HUP信号(モデムの切断のように「切断」)その中で実行されるシェルに(より正確には制御プロセス)そしてその過程フォアグラウンドプロセスグループ。したがって、バックグラウンドで実行されるプログラムは影響を受けませんが...
- シェルはこのHUP信号を受信すると、それをバックグラウンドジョブに伝播します。したがって、バックグラウンドプロセスが信号を無視しない場合、この時点で終了します。
- 端末が消えた後にプログラムが端末から読み取りまたは書き込みを試みると、入出力エラー(EIO)が原因で読み取りまたは書き込みが失敗します。これにより、プログラムが終了することを決定できます。
- もちろん、あなた(またはあなたのシステム管理者)はいつでもプログラムを終了することを決めることができます。
プログラムを実行し続けることが問題である場合は、次の手順を実行してください。
- プログラムが端末と対話できる場合は、次を使用します。画面またはマルチプレクサ仮想端末でプログラムを実行すると、勝手に接続を切断して再接続できます。
- プログラムを実行し続ける必要があり、対話型でない場合は、
nohup
コマンド(nohup myprogram --option somearg
)を使用してプログラムを開始します。このコマンドは、シェルがSIGHUPを送信せずに標準入力を名前付きファイルにリダイレクト/dev/null
し、標準出力と標準エラーをDirectedにリダイレクトします。nohup.out
. - プログラムを起動して端末を閉じたときにプログラムを終了したくない場合は、組み込み
disown
プログラムを実行してください(シェルに組み込み機能がある場合)。そうでない場合は、SIGHUPを伝播するシェルを回避するために、極端な偏りでシェルをシャットダウンすることができます(シェル内の指定されたプロセスの終了kill -KILL $$
トリガーをバイパスします)。 - すでにプログラムを実行していて他の端末に再接続したい場合は、いくつかの方法がありますが、100%信頼できません。バラより実行中のプロセスを拒否し、それを新しいスクリーンシェルに接続する方法は?そして関連する問題。