可能重复:
如何在ssh断开连接后保持程序继续运行。
如何使用 ssh 在远程 Unix 机器上运行命令并在命令完成之前退出?
我在生产机器上运行 mongo 服务器。我通过 ssh 控制台访问它。如果我运行 mongo 服务器,它会在前台运行。如果我关闭客户端上的 SSH 窗口,服务器上的 mongo 进程就会终止。
即使我在后台以“mongod &”的形式运行它,如果连接丢失它仍然会死机。
我如何正确运行此守护进程以使其不依赖于活动的 SSH 会话?
编辑:使用 ubuntu 10 控制台作为服务器
答案1
当您关闭 shell 时,它会向其生成的所有作业发送 SIGHUP 信号。默认情况下,SIGHUP 将终止任何进程。
如果您知道在生成进程时需要“保持其运行”,则可以使用nohup
来生成进程。作为副作用,如果这些流指向终端,它将把 stdout 和 stderr 重定向到文件 nohup.out。如果您不想要此文件,您可能需要自己重定向它们。
您也可以使用 来运行它setsid
,这将创建一个新的进程组。由于它不在 shell 的进程组中,因此您的 shell 将不再向它发送 SIGHUP。
如果您已经启动了程序,并且恰好正在运行 bash 或 zsh(很可能在 Linux 上),则可以使用disown
。
要么运行命令以&
强制后台运行,要么正常运行,键入 Ctrl-Z 以暂停它,然后bg %1
(假设它是作业 #1)将其取消暂停并将其作为后台进程运行。然后键入disown %1
让 bash/zsh 忘记它。
disown
是我通常的方法,我不需要记住像nohup
要求的那样弄乱输出流。
答案2
尝试使用nohup mongod &
。这将阻止程序接收在 shell 退出时(连接丢失后)发送的 SIGHUP 信号。这是所有 shell 中内置的标准 shell。
您还可以使用setsid mongod &
它将程序与终端分离,因此当 shell 退出时,不会发送 SIGHUP 信号。(其他事情也会发生,但这是主要的副作用。)Setsid 并不是所有 shell 的标准,但它是 Ubuntu 10 上的 bash 的标准。
您还可以启动 gnu-screen,它将在连接丢失后保持会话运行,允许您重新连接并再次与 shell 交互。程序的状态不会改变,它将在断开连接时继续运行。