我想在后台运行一个进程而不在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
,并且每种情况都有不同的解决方法。
一种可能性(在这里似乎并非如此)是系统使用systemd,其中logind.conf
配置了KillUserProcesses=yes
。在这种情况下,关闭终端不会造成问题,但是注销系统会造成问题。在这种情况下,解决方法是使用
$ systemd-run --scope --user [command]
这基本上只是告诉systemd它不应终止该进程。
另一种可能性是,产生的进程实现了自己的处理程序,SIGHUP
该处理程序将覆盖对的保护nohup
。在这种情况下,即使您保持登录状态,关闭外壳程序也会立即出现问题。您可以使用以下方法进行检查:
$ 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
了首先发送该进程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句