假设我有一个really-long-running.sh
(“非常长”,如“小时”)。
我希望让远程机器执行它(然后关闭本地机器)。
不幸的是,我对 ssh 没什么经验。它能达到我想要的效果吗?还是只是屏蔽了连接?
ssh user@host "bash -s " < really-long-running.sh &
更新
但事实并非如此。
那么我该如何做呢?
答案1
还有nohup
工具。来自man nohup
:
nohup-运行不受挂断影响的命令,并将输出输出到非tty
你可以一步一步来:
ssh
到远程主机nohup /path/to/really-long-running.sh > /path/to/where-to-store-the-output &
- 现在可以断开连接;
或者立即从本地机器执行:
ssh remote-host 'nohup /path/to/really-long-running.sh > /path/to/where-to-store-the-output &'
这些示例要求脚本可执行且驻留在远程主机上。在您的代码中,脚本可能不可执行,并且它是一个本地文件。
答案2
我建议您在执行端使用screen
或tmux
- 这使您可以随意断开连接并重新连接,让您可以选择在以后的某个时间读取脚本的输出。
答案3
那‘可能’会做你想做的事(之后再次 ssh 并使用 top 检查?)
然而,理想的方法是在屏幕会话(或 tmux)中启动该命令,然后你可以断开与正在运行的会话的连接,同时仍然可以查看它正在做什么
或者你可以使用 ssh 登录,然后通过后台操作从当前终端“断开”该进程,然后使用以下命令断开该进程
ctrl + z
bg
disown
或者,您可以通过在命令中添加 & 来从命令行将进程置于后台。但是,您仍然需要放弃它,以防止它在断开连接时死亡。
答案4
您可以at
在远程机器上使用来安排您的工作。
$ ssh remote-host
$ at now + 5 min
at> really-long-running.sh
at> <Ctrl-D>
job 1 at 2016-10-12 09:10
$ exit
您的作业将按照您为 at 作业定义的时间表运行。查看手册页在了解更多详情。默认配置允许任何用户使用。