web-dev-qa-db-ja.com

nohupでプロセスを強制終了する理由

シェル出口でプロセスを強制終了せずにバックグラウンドで実行したいのですが、Nohupの概念によれば、手動で強制終了するまで次のコマンドが機能するはずです。

Nohup uwsgi --http :8008  --module crawled_data_center.wsgi > /dev/null &

シェルにrootユーザーでログインしていますが、シェルを終了すると、プロセスが終了しました。私はいくつかのプロジェクトでNohupを数回使用して正しく機能しているので奇妙に思われますが、この場合、私は吸いました、何が問題で、シェル出口でそれを殺さずにバックグラウンドで実行するにはどうすればよいですか?

更新:

私はそれを扱いました:

$ Nohup uwsgi --http :8008  --module crawled_data_center.wsgi > /dev/null &
$ disown -l
$ disown -h JOBID

しかし、私の質問は、どのようにしてSIGHUPNohupおよび&を殺すことができるのかについてです。

/etc/systemd/logind.confの内容は次のとおりです:

[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
Controllers=blkio cpu cpuacct cpuset devices freezer hugetlb memory perf_event net_cls net_prio
ResetControllers=
#InhibitDelayMaxSec=5
#HandlePowerKey=poweroff
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate
#HandleLidSwitch=suspend
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
#LidSwitchIgnoreInhibited=yes
#IdleAction=ignore
#IdleActionSec=30min
7
Yusef

私の知る限り、Nohupによって保護された後にプロセスが強制終了される可能性のある状況は2つあり、状況ごとに異なる回避策があります。

ここではそうではないと思われる可能性の1つは、システムがsystemdを使用していて、logind.confKillUserProcesses=yesで構成されていることです。この場合、ターミナルを閉じても問題は発生しませんが、システムからログアウトすると問題が発生します。この場合の回避策は、

$ systemd-run --scope --user [command]

これは基本的に、systemdにプロセスを強制終了しないように指示するだけです。

他の可能性は、生成されたプロセスがSIGHUPの独自のハンドラーを実装し、Nohupの保護をオーバーライドすることです。この場合、ログインしたままであっても、シェルを閉じるとすぐに問題が発生します。これは次の方法で確認できます。

$ Nohup [command] &
$ grep Sig /proc/$!/status

線が見えるはずです

SigIgn: 0000000000000001

(または他の16進数の文字列)。 SIGHUPはシグナル番号1であるため、このビッグエンディアンの16進数に最初の(最下位)ビットが設定されている場合(つまり、最後の桁が1、3、5、7のいずれかである場合) 、9、B、D、またはF)の場合、SIGHUPは無視されます。それ以外の場合、プログラムはNohupの保護を上書きする独自のハンドラーをインストールしました。

この場合の解決策は、disownを使用することです。

Nohup [command] & disown

これにより、シェルのジョブリストからプロセスが削除され、SIGHUPが最初から送信されなくなります。

17
Fox