Background-Process

為什麼程序被 nohup 殺死

  • May 29, 2018

我想在後台執行一個程序而不在 shell 退出時殺死它,根據 Nohup 概念,以下命令應該可以工作,直到我手動殺死它:

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

我以root使用者登錄到shell,但退出shell後,程序終止。這似乎很奇怪,因為我nohup在多個項目中使用過多次並且工作正常,但在這種情況下我已經很糟糕了,問題是什麼,我怎樣才能在後台執行它而不在 shell 退出時殺死它?

更新:

我處理它:

$ 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

據我所知,有兩種情況會導致程序在被保護後被殺死nohup,每種情況都有不同的解決方法。

一種可能性(這裡似乎不是這種情況)是系統使用 systemdlogind.conf配置了KillUserProcesses=yes. 在這種情況下,關閉終端不會導致問題,但退出系統會導致問題。在這種情況下,解決方法是使用

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

這基本上只是告訴 systemd 它不應該終止該程序。

另一種可能性是生成的程序實現了自己的處理程序,SIGHUP該處理程序覆蓋了nohup. 在這種情況下,即使您保持登錄狀態,shell 關閉後也會立即出現問題。您可以通過以下方式檢查:

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

你應該看到一條線

SigIgn: 0000000000000001

(或其他一些十六進制數字字元串)。SIGHUP是信號號1,所以如果這個大端十六進制數設置了它的第一個(最低有效)位(即,最後一位是 1、3、5、7、9、B、D 或 F 之一),然後SIGHUP被忽略。否則,程序已經安裝了自己的處理程序來覆蓋nohup.

在這種情況下,解決方案是使用disown

nohup [command] & disown

這會從 shell 的作業列表中刪除該程序,從而防止SIGHUP首先被發送。

引用自:https://unix.stackexchange.com/questions/420594