ssh结束后继续执行程序
Continue executing a program, after end of ssh
我有一个脚本,它 运行 是一个具有 1000 个不同参数(每次执行一个)的可执行文件。这可能需要几个小时。我 运行 这个在实验室的电脑里。现在,我在家用电脑上通过 ssh 执行此操作。我可以执行 ssh,开始执行脚本,注销,但以某种方式允许脚本继续执行吗?
我的意思是实验室电脑仍将打开,我不关心程序的标准输出。有趣的结果将被写入一个文件,我可以在再次登录时查看。
我尝试这样做,但脚本将在我退出后立即停止执行。
由于我无法将问题标记为 this 的重复问题,因为 "The duplicate question must exist on Stack Overflow" 并且因为我想分享我的经验,所以我将回答我自己的问题。
tmux
和 screen
是重复的最佳答案。然而,第一个在我的 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还不存在,切换会产生一些重新学习的开销。)
我有一个脚本,它 运行 是一个具有 1000 个不同参数(每次执行一个)的可执行文件。这可能需要几个小时。我 运行 这个在实验室的电脑里。现在,我在家用电脑上通过 ssh 执行此操作。我可以执行 ssh,开始执行脚本,注销,但以某种方式允许脚本继续执行吗?
我的意思是实验室电脑仍将打开,我不关心程序的标准输出。有趣的结果将被写入一个文件,我可以在再次登录时查看。
我尝试这样做,但脚本将在我退出后立即停止执行。
由于我无法将问题标记为 this 的重复问题,因为 "The duplicate question must exist on Stack Overflow" 并且因为我想分享我的经验,所以我将回答我自己的问题。
tmux
和 screen
是重复的最佳答案。然而,第一个在我的 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还不存在,切换会产生一些重新学习的开销。)