【发布时间】:2014-12-02 10:18:14
【问题描述】:
在一个非常简化的场景中,我有一个如下所示的脚本:
mv test _test
sleep 10
echo $1
mv _test test
如果我执行它:
ssh localhost "test.sh foo"
只要脚本正在运行,测试文件的名称中就会有一个下划线,当脚本完成时,它会返回foo。脚本应该继续运行,即使您通过按ctrl+c 终止ssh 命令或者如果您失去与服务器的连接,但它不会(文件未重命名为“test”)。所以,我尝试了以下方法:
nohup ssh localhost "test.sh foo"
它使 ssh 对ctrl+c 免疫,但与服务器的不稳定连接仍然会导致问题。经过一些调试,结果证明如果没有回声,脚本实际上会到达结尾。仔细想想,这是有道理的——当连接断开时,没有更多的stdout(ssh 套接字)可以回显,所以它会默默地失败。
当然,我可以回显到一个文件,然后获取该文件,但我更喜欢更智能的东西,类似于test tty && echo $1(但tty 像这样调用总是返回false)。非常感谢任何建议。
【问题讨论】:
-
我尝试了不同的东西,例如:
ssh -t localhost "test.sh foo"、ssh -t localhost "nohup test.sh foo"、nohup ssh -t localhost "test.sh foo"等。我什至将所有环境变量和/dev目录的内容打印到一个文件中,只是为了看看脚本是否能以某种方式识别连接丢失......我能想到的唯一两个想法是 ping 回主机或将输出保存到文件,但我很确定有一个更微妙的解决方案...... -
>/dev/null 2>&1是你的朋友。 -
是的,但我需要接收脚本的输出,除非我失去了与服务器的连接 - 在任何一种情况下,脚本都必须结束。
-
在这种情况下,我会考虑使用 tee,它将优雅地处理关闭的输出。