
コマンドを使用してバックグラウンドでプロセスを開始する、リモート セッション経由でシェル スクリプトを起動しようとしました。
nohup python3 run.py > nohup.out &
リモート セッションが閉じられると、次のメッセージが表示されてプロセスが強制終了されます。
シグナルSIGHUPをキャッチしました
SIGHUP がキャッチされましたが、デーモン化されていません。終了します。
理解できません。なぜバックグラウンドで起動したのにプロセスが強制終了されるのでしょうか?ノーアップ &?
答え1
Python プログラムは を元に戻しますnohup
。
nohup
ハングアップ信号を無視しSIG_IGN
、同じプロセスでプログラムをチェーンロードします。
Pythonプログラムすぐにリセットされますハングアップ信号の信号処理、独自の信号ハンドラをインストールします。そのハンドラは内部関数をチェックし (私が見た限りでは、いくつかの誤った仮定に基づいており、あまり適切に設計されていません)、ハングアップ信号を受信した場合の適切なアクションは、そのメッセージを出力して終了することであると決定します。
Python プログラムは設計上、 -able ではありませんnohup
。ジョブ制御シェルと POSIX セッション/ジョブ セマンティクスを備えたシステムでは、disown
まず最初にシェルがハングアップ信号を送信することを認識しないように、ジョブを -ing する必要があります。
(systemd オペレーティング システムでは、それだけでは十分ではありません。systemd の開発者は、ユーザー空間のログイン セッション メカニズムをかなり不十分なものにしてしまったため、ログアウトのたびにログイン セッションを切断するのではなく、システムのシャットダウンを通知する systemd のメカニズムも作動しないようにする必要があります。)