Ubuntu的nohup命令无法正常工作

3

我正在使用AWS(ubuntu实例),希望使用nohup在后台运行。

我在putty中尝试了这段代码。

sudo nohup python3 manage.py runserver --settings=health.settings 0.0.0.0:80

然后,
nohup: ignoring input and appending output to 'nohup.out'

这段代码能够正常运行网站。 但是当我按下'Ctrl + C'时,nohup就停止了。 出了什么问题?


2
顺便提一下,以root身份运行应用服务器通常是一个不好的想法。 - Charles Duffy
通常情况下,您需要在其前面放置其他内容(例如负载均衡器或高性能 Web 服务器以提供静态内容传递、应用重写规则、强制执行安全性和运行 SSL 等),因此在这一点上,您不需要直接绑定到端口 80,因此您甚至不需要临时为您的应用程序服务器提供特权(而每个受人尊敬的前端 Web 服务器或负载均衡器都有使用这些特权来绑定到端口 80 并可能读取 SSL 私钥然后删除它们的能力)。 - Charles Duffy
1个回答

8

nohup命令可以防止进程收到HUP信号(即当控制终端退出时发送的挂起信号),从而使进程不会被中断。但它并不忽略SIGINT信号,即ctrl+c发送的信号。

使用&作为后续命令分隔符,在后台启动您的进程:

sudo nohup python3 manage.py runserver --settings=health.settings 0.0.0.0:80 &

或者您可以自行重定向标准输入/输出/错误,并使用bash内置命令disown,它与nohup一样有效地防止HUP信号的传播:

sudo python3 manage.py runserver ... </dev/null >runserver.log 2>&1 &
disown -h

...或者更好的方法是使用一个真正的进程监控系统(UpstartDJB daemontoolsrunitlaunchdsystemd,或其他许多系统。最佳实践是使用您的操作系统供应商所提供的那个系统,除非有强烈的反对理由)在后台运行和重启进程。


1
所以,这里实际上有三个不同的问题,我将逐一解释它们。(1) 什么时候可以将应用服务器作为root而不是较低权限的用户运行?;(2) 什么时候可以使用nohup而不是像systemd这样的进程监控系统?;(3) 什么时候可以直接将应用服务器暴露在互联网上,而不是在Web服务器后面? - Charles Duffy
1
(1)-虽然我在安全行业工作,但我真的会反驳“从不这样做”。这会使任何服务的妥协成为整个服务器的妥协,而不是仅限于单个服务(如果您小心该帐户的权限,则只能访问其数据而无法更改其代码)。当连接到互联网时,情况会变得更加复杂——可能只有20人需要使用您的服务器,但如果可以让数百万人访问,那么您需要计划使用常见漏洞进行扫描/攻击。 - Charles Duffy
1
什么情况下可以使用nohup而不是像systemd这样的进程监控系统呢?基本上,只要你不关心在故障后你的服务是否会自动恢复就可以了。亚马逊确实会随机重启服务器--如果接受在此之后你的服务一直处于关闭状态,除非你登录并运行一个命令,那么就没问题了。但是,如果你要通过这个服务来经营公司(或者向那些你以后想以专业方式合作的人展示),那么值得采取正确的方式。 - Charles Duffy
1
什么情况下可以在没有 Web 服务器的情况下直接公开应用服务器?因此,这里有许多因素需要考虑您需要哪些功能。假设您通过不使用 sudo 来为它授予根权限的另一种方式将应用程序服务器公开在端口80上(例如将其放置在端口8080上并告诉 iptables 将入站请求映射到本地端口8080),那么除非您遇到性能问题或您需要正常的 Web 服务器免费提供给您的功能,否则这并不具有说服力。 - Charles Duffy
1
(关于“性能问题”——如果您正在提供大量不需要动态生成的内容,则特别相关;nginx/apache等通常可以非常好地处理这些内容) - Charles Duffy
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接