通过 SSH 执行长命令后继续脚本
Continuing script after long command executed over SSH
我的 local
计算机正在 运行ning 一个 bash 脚本,该脚本在 remote
上执行另一个脚本(本地),如下所示:
#!/bin/bash
# do stuff
ssh remote@remote "/home/remote/path/to/script.sh"
echo "Done"
# do other stuff
script.sh
执行大约需要 15 分钟。 没有丢失连接,script.sh
被完全执行(直到最后一行)。但是,Done
永远不会被回显(other stuff
也不会被执行)。
备注:
我试过用screen
和nohup
,但是就像我说的,连接稳定,script.sh
执行彻底(script.sh
好像没有掉线)。
我需要 script.sh
结束才能继续做 other stuff
所以我真的不能 运行 脚本和分离(或者我在我开始做 other stuff
).
之前需要知道脚本何时结束
如果我使用仅持续 5 分钟(而不是 15 分钟)的虚拟脚本,一切正常。
编辑:
script.sh
用于测试:
#!/bin/bash
touch /tmp/start
echo "Start..." & sleep 900; touch /tmp/endofscript
您是否尝试过在脚本中设置 set -xv
,或者使用 bash -xv script.sh
执行这两个脚本以获取脚本执行的详细信息?
添加 -o ServerAliveInterval=60
解决了这个问题。
The ServerAliveInterval option prevents your router from thinking the SSH connection is idle by sending packets over the network between your device and the destination server every 60 seconds.
(source)
对于需要几分钟执行且没有输出的脚本,这将使连接保持活动状态并避免超时和挂起。
两个选项:
ssh -o ServerAliveInterval=60 remote@remote "/home/remote/path/to/script.sh"
- 将以下行添加到
local
计算机的 ~/.ssh/config
(将 remote
替换为您的遥控器名称或 *
以启用任何遥控器):
Host remote
ServerAliveInterval 60
更多信息:
我的 local
计算机正在 运行ning 一个 bash 脚本,该脚本在 remote
上执行另一个脚本(本地),如下所示:
#!/bin/bash
# do stuff
ssh remote@remote "/home/remote/path/to/script.sh"
echo "Done"
# do other stuff
script.sh
执行大约需要 15 分钟。 没有丢失连接,script.sh
被完全执行(直到最后一行)。但是,Done
永远不会被回显(other stuff
也不会被执行)。
备注:
我试过用
screen
和nohup
,但是就像我说的,连接稳定,script.sh
执行彻底(script.sh
好像没有掉线)。我需要
之前需要知道脚本何时结束script.sh
结束才能继续做other stuff
所以我真的不能 运行 脚本和分离(或者我在我开始做other stuff
).如果我使用仅持续 5 分钟(而不是 15 分钟)的虚拟脚本,一切正常。
编辑:
script.sh
用于测试:
#!/bin/bash
touch /tmp/start
echo "Start..." & sleep 900; touch /tmp/endofscript
您是否尝试过在脚本中设置 set -xv
,或者使用 bash -xv script.sh
执行这两个脚本以获取脚本执行的详细信息?
添加 -o ServerAliveInterval=60
解决了这个问题。
The ServerAliveInterval option prevents your router from thinking the SSH connection is idle by sending packets over the network between your device and the destination server every 60 seconds. (source)
对于需要几分钟执行且没有输出的脚本,这将使连接保持活动状态并避免超时和挂起。
两个选项:
ssh -o ServerAliveInterval=60 remote@remote "/home/remote/path/to/script.sh"
- 将以下行添加到
local
计算机的~/.ssh/config
(将remote
替换为您的遥控器名称或*
以启用任何遥控器):Host remote ServerAliveInterval 60
更多信息: