nohup 不会't require you to use ' & ' to background the process - meaning you can still use ctrl-c to send SIGINT. The process still responds to keyboard input. It also doesn' t自动更改标准输入,因此建议您通过“ < /dev/null ”自行更改 .
请不要将 nohup 与通常使用的其他功能混淆(例如背景) . OP特别询问 nohup .
In Practice
在实用性方面,当你想要启动一次性长时间运行的进程时,它应该在shell退出时继续,你需要使用 nohup ,但是你需要制作一个守护进程,但是有些属性是守护进程仍然可以用于nohup作业,例如“ cd / ” .
4 回答
nohup
命令是穷人将进程作为守护进程运行的方式 . 正如Bruno Ranschaert所指出的那样,当您在交互式shell中运行命令时,它有一个控制终端,并在控制进程(通常是您的登录shell)退出时收到SIGHUP(挂断)信号 .nohup
命令安排输入来自/dev/null
,输出和错误都转到nohup.out
,程序忽略中断,退出信号和挂起 . 它实际上仍然具有相同的控制终端 - 它只是忽略终端控制 . 请注意,如果您希望进程在后台运行,则必须告诉shell在后台运行它 - 至少在Solaris上(即,您键入'nohup sleep 20 &
';没有&符号,进程同步运行在前景) .通常,通过
nohup
运行的进程需要花费时间,但不会等待来自其他地方的交互 .通常(这意味着如果你努力,你可以找到这些规则的例外),守护进程是潜伏在后台,与任何终端断开连接,但等待响应某种输入的东西 . 网络守护程序等待连接请求或UDP消息通过网络到达,执行适当的工作并再次发送响应 . 例如,可以考虑使用Web服务器或DBMS .
当一个进程完全守护自身时,它会经历
nohup
代码经过的一些步骤;它重新排列其I / O,因此它没有连接到任何终端,从进程组中分离出来,忽略了适当的信号(这可能意味着它没有显示在启动它的终端的ps
输出中 .您可以查看W Richard Stevens和Stephen A Rago的Advanced Programming in the Unix Environment, 3rd Edn,或者Marc J Rochkind的Advanced Unix Programming, 2nd Edn来讨论守护进程 .
我有一个程序
daemonize
,它会守护一个没有正确完成工作的程序 . 如果您需要,请与我联系 - 查看我的 Profiles .Becoming a daemon
这个链接有一个很好的进程列表,一个进程应该成为一个守护进程:
https://web.archive.org/web/20120328110436/http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
由于版权问题,我无法逐字复制列表(请参阅“关于”部分),但这里是摘要:
fork
(第一次) - 所以我们不是小组组长,让父母退出 .致电
setsid()
- 成为新 Session 的领导者 . 此呼叫仅在我们不是组长时才有效 . 这个新 Session 没有控制终端 .fork
(第二次) - 所以我们没有重新获得一个控制终端),并让父退出 .cd
到根目录 - 所以我们不阻止其他目录被卸载 .设置
umask
到期望值(可选) - 因为我们可以've inherited a mask we didn' t想要 .关闭stdin,stdout,stderr(或者只是重新打开它们指向其他地方)
nohup
nohup
做了什么:如果stdout和stderr连接到终端,则将它们重定向到
nohup.out
忽略了SIGHUP
Similarities and Differences
注意唯一的常见操作是如何重定向stdout和stderr . 成为一个守护进程甚至不需要忽略SIGHUP .
nohup
不会't require you to use '&
' to background the process - meaning you can still use ctrl-c to send SIGINT. The process still responds to keyboard input. It also doesn' t自动更改标准输入,因此建议您通过“< /dev/null
”自行更改 .请不要将
nohup
与通常使用的其他功能混淆(例如背景) . OP特别询问nohup
.In Practice
在实用性方面,当你想要启动一次性长时间运行的进程时,它应该在shell退出时继续,你需要使用
nohup
,但是你需要制作一个守护进程,但是有些属性是守护进程仍然可以用于nohup作业,例如“cd /
” .定期安排的定期任务最好通过
cron
(或其他一些调度程序)运行 .守护进程最适合监督没有可预测的开始时间的重复任务 . 通常没有明确的守护进程结束时间(它由用户/另一个进程或系统关闭显式停止) . 守护进程通常是响应应用程序(客户端)或其他条件的服务(例如,通过unix在IO设备上传入数据)选择()) . 其他守护进程轮询一个条件并执行响应操作 .
Addendum about controlling terminal
见this page . 一个简短的总结是控制终端授予对stdin,stdout,stderr的无限制访问权限 . 只有一个进程组可以访问stdin . 默认情况下,后台进程组也可以写入stdout和stderr .
而且,似乎发送到终端的键盘信号仅被发送到将其作为控制终端的进程组 .
在UNIX变体中,进程与终端进程(登录shell)相关联 . 因此,当终端进程退出时,由于这种关联,该进程也会停止 . 当终端停止时,nohup会阻止进程退出 .
守护程序或恶魔是一个由系统启动时启动的进程,它运行直到关闭,没有用户明确要求它 . 因此,根据定义,它不是用户交互的一部分,而是属于系统 .
如果您可以以用户身份访问系统,则可以使用nohup . 如果您是sysadmin,则可以安装deamon进程 . 对于这个过程来说无关紧要 .
无法启动守护程序,而用户启动nohup .