web-dev-qa-db-ja.com

Nohupのバックグラウンドプロセスが停止しているのはなぜですか?

コマンドを使用してバックグラウンドでプロセスを開始するリモートセッションを介してシェルスクリプトを開始してみました。

Nohup python3 run.py > Nohup.out &

リモートセッションが閉じられると、プロセスは次のメッセージで強制終了されます。

シグナルSIGHUPをキャッチしました

SIGHUPはキャッチされましたがデーモン化されていません。終了します。

わかりません。 Nohup&を使用してバックグラウンドで開始したときにプロセスが強制終了されるのはなぜですか?

10
Mostwanted Mani

あなたのPythonプログラムはNohupを元に戻します。

NohupSIG_IGNのハングアップシグナルを無視し、同じプロセスでプログラムをチェーンロードします。

あなたのPythonプログラムは、ハングアップシグナルのシグナルハンドリングを即座にリセットし、独自のシグナルハンドラーをインストールします。このハンドラーは、内部機能(十分に設計されておらず、私が見たものである場合、いくつかの欠陥のある仮定に基づいている)。ハングアップシグナルの受信時の適切なアクションは、そのメッセージを出力して終了することであると判断します。

あなたのPythonプログラムの設計はNohup- ableではありません。ジョブ制御シェルとPOSIXセッション/ジョブセマンティクスを備えたシステムでは、disowningである必要がありますシェルがハングアップシグナルを送信することを最初に知らないようにするためのジョブ。

(それでも、systemdオペレーティングシステムでは十分ではありません。systemdの人々は、ユーザー空間のログインセッションメカニズムに少し耳を傾けているため、ハングアップではなく、システムのシャットダウンを通知するsystemdのメカニズムがすべてのログアウト時のログインセッションも開始されません。)

参考文献

10
JdeBP