我有一台运行Ubuntu服务器的服务器。 它是一个代理的背后……我不知道这是否有所作为。 但是我发现我已经尝试了几个进程,当我退出SSH会话时终止。 例如,我有ipython笔记本服务器和在该服务器上运行的Mongod服务器进程。 每当我注销时,即使这些进程在后台运行,
我最近发现了nohud命令。 但是,为什么我没有遇到过大多数服务器? 有没有在Ubuntu的服务器的某种默认情况下,当用户从SSH挂起时,终止用户的所有进程? 我可以为所有进程默认运行nohud吗?
谢谢
Ubuntu进程处理信号的方式与其他Linux发行版和Unices一样。 当SSH会话断开连接时,SIGHUP信号被发送到会话领导进程 ,这可能是bash 。
Bash反过来自己清理 :
收到
SIGHUP后,shell会默认退出。 在退出之前,交互式shell将SIGHUP重新发送到所有正在运行或停止的作业。 停止的工作发送SIGCONT以确保他们收到SIGHUP。 为防止shell将SIGHUP信号发送到特定作业,应使用disown内build(请参见作业控制内置 )将其从作业表中删除,或者使用disown -h标记为不接收SIGHUP。如果已经使用
shopt设置了huponexitshell选项(请参阅Shopt Builtin ),则当交互式loginshell退出时,Bash将向所有作业发送SIGHUP。
disown是Bash内置的命令。 nohup是一个具有相似效果的外部命令。
我不build议重新configurationBash来不杀死所有的subprocess(我也不知道如何去做)。 相反,更好的目标是防止Bash在TTY消失时死亡。 你可以使用screen , tmux或者mosh来保持Bash的活力。