ssh结束后继续执行程序

Continue executing a program, after end of ssh

我有一个脚本,它 运行 是一个具有 1000 个不同参数(每次执行一个)的可执行文件。这可能需要几个小时。我 运行 这个在实验室的电脑里。现在,我在家用电脑上通过 ssh 执行此操作。我可以执行 ssh,开始执行脚本,注销,但以某种方式允许脚本继续执行吗?

我的意思是实验室电脑仍将打开,我不关心程序的标准输出。有趣的结果将被写入一个文件,我可以在再次登录时查看。

我尝试这样做,但脚本将在我退出后立即停止执行。

由于我无法将问题标记为 this 的重复问题,因为 "The duplicate question must exist on Stack Overflow" 并且因为我想分享我的经验,所以我将回答我自己的问题。

tmuxscreen 是重复的最佳答案。然而,第一个在我的 Debian 中没有被识别(可能需要安装),而后者已经准备就绪并且工作正常,对于这个简单的场景:

  • ssh 进入你的远程盒子。输入screen然后启动你想要的进程。

  • Ctrl-A然后Ctrl-D。这将 "detach" 您的屏幕会话,但保留您的进程 运行。您现在可以退出远程框。

  • 如果您想稍后再回来,请再次登录并键入 screen -r 这将 "resume" 您的屏幕会话,您可以看到您的过程的输出。

这条评论也不错:"I will usually name my screen sessions using screen -S name to make it easier to connect to the correct one later. "


正如 deviantfan 所说,“tmux 需要安装。一个简单的 apt-get install tmux 作为 root 就足够了。”。

我假设当您尝试时,您使用 myscript & 将其置于后台,然后注销。某些 GNU/Linux 发行版默认发送 SIGHUP 给所有将会话 tty 作为其 tty 的进程(或其他从登录会话中查找进程的方式,例如父 PID 树,我忘记了。 )

所以,一个解决方案是:

nohup myscript &

真的就是这么简单。当运行低于nohup时,你的进程将忽略挂断信号。如果来自终端,nohup 将 stdin 从 /dev/null 重定向,stdout/stderr 重定向到 nohup.out。然后你阅读 nohup.out,它将在你调用脚本的目录中创建。

tmux 非常好,我一直在使用它,但实际上并不需要它。 (其实我用的是screen,但那只是因为我开始用screen的时候tmux还不存在,切换会产生一些重新学习的开销。)