bash:当stdout不存在时该怎么办

时间:2014-12-02 10:18:14

标签: linux bash ssh stdout tty

在一个非常简化的场景中,我有一个如下所示的脚本:

mv test _test
sleep 10
echo $1
mv _test test

如果我执行它:

ssh localhost "test.sh foo"

只要脚本正在运行,测试文件的名称就会有一个下划线,当脚本完成后,它会发回foo。即使您通过按ssh终止ctrl+c命令,或者如果您丢失了服务器的连接,脚本应该继续运行,但它不会(文件未重命名为“test”) 。所以,我尝试了以下内容:

nohup ssh localhost "test.sh foo"

它使ssh免疫ctrl+c但是与服务器的连接仍然会导致麻烦。经过一些调试后,事实证明,如果没有ECHO,脚本将实际到达终点。当你考虑它时,它是有道理的 - 当连接断开时,不再有stdout(ssh套接字)回显,所以它会失败,无声。

当然,我可以回显一个文件,然后获取文件,但我更喜欢更聪明的东西,沿着test tty && echo $1(但tty这样调用,总是返回{{1 }})。非常感谢任何建议。

3 个答案:

答案 0 :(得分:1)

你可以使用......

ssh -t localhost "test.sh foo"

......强制进行tty分配

答案 1 :(得分:1)

以下命令可以执行您想要的操作:

ssh -t user@host 'nohup ~/test.sh foo > nohup.out 2>&1 & p1=$!; tail -f ~/nohup.out & wait $p1'

... test.sh位于用户主目录

说明:

1。)“ssh -t user @ host”......非常清楚...启动远程会话
2.)“nohup~ / test.sh foo> nohup.out 2>& 1”...启动test.sh脚本,背景为nohup
3.)“p1 = $!;” ...将前一个命令的子pid存储在p1
中 4.)“tail -f~ / nohup.out&” ...在后台尾部nohup.out查看test.sh的输出 5.)“等待$ p1”...等待proccess test.sh(pid存储在p1中)完成

即使用ctrl + c打断它,上面的命令也能正常工作。

答案 2 :(得分:0)

正如st0ne建议的那样,tail失败,但不会导致脚本终止,而不是catecho。因此,不需要nohup,将stdout重定向到临时文件等等,只是简单明了:

mv test _test
sleep 10
echo $1 | tail
mv _test test

并执行:

ssh localhost "test.sh foo"