2014-12-02 54 views
2

在一个非常简化的情况下该怎么做,我有一个脚本,看起来像这样:击:当标准输出不存在

ssh localhost "test.sh foo" 

的:

mv test _test 
sleep 10 
echo $1 
mv _test test 

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

nohup ssh localhost "test.sh foo" 

,这让SSH免疫ctrl+c但到服务器断线连接还是引起了麻烦。经过一些调试后,事实证明,如果脚本中没有ECHO,脚本实际上会达到最终结果。当你考虑它的时候,这是有道理的 - 当连接断开时,没有更多stdout(ssh套接字)可以回显,所以它会自动失败。

我当然可以,呼应一个文件,然后得到的文件,但我宁愿更聪明的东西,沿着test tty && echo $1(但tty调用像这样总是返回false)线。任何建议,非常感谢。

+0

我尝试不同的东西,比如:' ssh -t localhost“测试。我甚至把所有环境变量和'/ dev'目录的内容打印出来,然后把所有的环境变量和/ dev目录的内容打印出来到一个文件,只是为了查看脚本是否能够以某种方式识别连接丢失......我能想到的唯一两个想法是ping回主机或将输出保存到文件中,但我确信有更多微妙的解决方案... – Ulrik 2014-12-03 21:59:07

+0

'>/dev/null 2>&1'是你的朋友 – 2014-12-03 23:46:15

+0

是的,但我需要从脚本接收输出,除非我失去了与服务器的连接 - 在任何一种情况下,脚本都必须结束 – Ulrik 2014-12-04 01:32:02

回答

1

以下命令你想要做什么:

ssh -t [email protected] '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”...启动在后台使用nohup的test.sh脚本
3.)“p1 = $ !;” ...将前一个命令的子pid存储在p1
中4.)“tail -f〜/ nohup.out &”...在后台运行tail nohup.out以查看test.sh的输出
5。 )“wait $ p1”...等待进程test.sh(pid存储在p1中)完成

即使用ctrl + c中断它,上述命令仍然有效。

+0

Wel l,这将脚本的输出存储在一个文件中,等待它终止,然后显示该输出。但是,当你失去与服务器的连接时,写入'stdout'的任何内容都会失败并中断脚本 - echo,cat,tail,你可以命名它。尝试执行ifconfig eth0 down正在运行,你会知道我在说什么(使用'ctrl + c'更容易) – Ulrik 2014-12-04 01:44:35

+1

尾部失败,但文件被移回测试。并且使用“-t”选项,您可以使用“test tty && echo $ 1”tty测试。 – st0ne 2014-12-04 07:28:23

1

可以使用...

ssh -t localhost "test.sh foo" 

...强制tty分配

+0

您的建议非常有意义,就像'nohup'一样,但不幸的是,它不起作用 - 'ctrl + c'终止执行远程脚本和连接丢失仍然会导致回应失败... – Ulrik 2014-12-03 21:52:46

0

由于st0ne建议,tail失败,但不会导致脚本终止,而不是catecho。因此,没有必要对nohup,重定向stdout到一个临时文件等只是简单明了:

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

,并执行它:

ssh localhost "test.sh foo"