プロセスを終了するためにnohupを使用するのはなぜですか?

プロセスを終了するために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

しかし、私の質問はどのようにSIGHUP殺人するnohupことができますか&

内容は次のとおりです/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

答え1

私が知っている限り、プロセスが保護された後に終了する可能性がある2つの状況がありnohup、それぞれの状況で解決策が異なります。

一つの可能​​性(ここではそうではないようです)はシステムです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最初にプロセスが送信されなくなります。

関連情報