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


10

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

nohup python3 run.py > nohup.out &

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

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

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

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


1
以前は、シェルジョブ制御の予期しない動作すべてに戸惑っていました。今、私は完全に使用しtmux、無視するnohupか、否認するか、またはバックグラウンドタスクを実行します。
Siyuan Ren、2018

回答:


10

Pythonプログラムが元に戻しnohupます。

nohupとのハングアップ信号を無視SIG_IGNし、同じプロセスでプログラムをチェーンロードします。

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

設計によるPythonプログラムはできませんnohup。ジョブ制御シェルとPOSIXセッション/ジョブセマンティクスを備えたシステムdisownでは、最初にシェルがハングアップシグナルを送信することをシェルが認識しないように、ジョブを起動する必要があります。

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

参考文献


3
それを行うのは彼らのPythonプログラムですか、それとも背後で黙ってそれを行うのはPythonインタープリター(/ランタイム環境)ですか?
ilkkachu

また、Mac OSでは、sshセッションからログアウトすると、の使用を開始してもシェルジョブが終了しnohupます。それに対する救済策を見つけていません
imhotap '29年

さて、問題がシグナルハンドラーである場合、OPはシグナルハンドラーをプロセスを強制終了しないハンドラーに変更するだけで済みます。これは、だれがそのようなシグナルハンドラをインストールするかとは無関係に機能するはずです。sshについて追加したいのですが、プロセスが存続している場合でも、問題が発生することがあります。数年前、私はいくつかのアクセス許可エラーを理解しようとするのにかなりの時間を失い、結局のところ、犯人はKerberosでした:sshセッションが閉じられたときにトークンが期限切れになったため、それらの代わりに使用する新しいトークンを作成する必要がありましたsshセッションの。
バクリウ

@JdeBP私が試したsetsid nohup python3 run.py > nohup.out &setsidはこの問題を解決しました。これは適切なアプローチですか?
Mostwanted Mani
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.