【问题标题】:bash: what to do when stdout does not existbash:当标准输出不存在时该怎么办
【发布时间】: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,它将优雅地处理关闭的输出。

标签: linux bash ssh stdout tty


【解决方案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" ... 在后台使用 nohup 启动 test.sh 脚本
3.) "p1=$!;" ... 将上一个命令的子 pid 存储在 p1
4.) "tail -f ~/nohup.out &" ... tail nohup.out 在后台查看 test.sh 的输出
5.) "wait $p1" ... 等待 proccess test.sh(其中 pid 存储在 p1 中)完成

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

【讨论】:

  • 嗯,这会将脚本的输出存储在一个文件中,等待它终止,然后显示该输出。但是,当您失去与服务器的连接时,写入 stdout 的任何内容都会失败并中断脚本 - echocattail 你可以命名它...尝试在脚本运行时执行 ifconfig eth0 down ,你就会知道我在说什么(使用ctrl+c 更容易)
  • 尾部失败,但文件被移回测试。通过“-t”选项,您可以使用“test tty && echo $1” tty 测试。
【解决方案2】:

你可以使用...

ssh -t localhost "test.sh foo"

...强制 tty 分配

【讨论】:

  • 你的建议很有道理,就像nohup一样,但不幸的是,它不起作用-ctrl+c终止远程脚本的执行,连接丢失仍然导致回显失败...
【解决方案3】:

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

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

并执行它:

ssh localhost "test.sh foo"

【讨论】:

    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2012-05-11
    • 2015-07-25
    • 2013-12-25
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多