我想在后台运行一个进程,而不在 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
答案1
据我所知,有两种情况会导致进程受保护后被杀死nohup
,每种情况都有不同的解决方法。
一种可能性(此处似乎并非如此)是系统使用配置logind.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
首先发送该进程。