我有一台运行 ubuntu 服务器的服务器。它位于代理后面……我不知道这是否有区别。但我发现,我尝试过的几个进程在退出 SSH 会话时会被终止。例如,我在该服务器上运行 ipython 笔记本服务器和 Mongod 服务器进程。每当我注销时,这两个进程都会终止,即使它们在后台运行&
我最近发现了这个nohud
命令,它工作得非常好。但是,为什么我在大多数服务器上都没有遇到这种情况?unbuntu 服务器中是否有某种默认设置,当用户从 SSH 挂断时会终止所有进程?我可以默认为所有进程运行 nohud 吗?
谢谢
答案1
Ubuntu 进程处理信号的方式与其他 Linux 发行版和 Unix 相同。当 SSH 会话断开连接时,会向会话领导进程,这很可能是bash
。
反过来,Bash自行清理:
默认情况下,shell 在收到 时退出
SIGHUP
。在退出之前,交互式 shell 会将 重新发送SIGHUP
给所有正在运行或已停止的作业。已停止的作业将被发送SIGCONT
以确保它们收到SIGHUP
。为了防止 shellSIGHUP
向特定作业发送信号,应使用 disown 内置命令将其从作业表中删除(请参阅作业控制内置函数)或标记为不接收SIGHUP
使用disown -h
。如果
huponexit
shell 选项已经设置shopt
(见Shopt 内置),SIGHUP
当交互式登录 shell 退出时,Bash 会向所有作业发送一个。
disown
是 Bash 内置命令。 nohup
是具有类似效果的外部命令。
我不建议重新配置 Bash 以不终止其所有子进程(我也不知道该怎么做)。相反,更好的目标是防止 Bash 在 TTY 消失时死亡。您可以使用screen
、tmux
或mosh
来保持 Bash 处于活动状态。