我将使用以下bash脚本ping远程主机的SSH端口,该端口正常运行:
(: </dev/tcp/$vm_ip/22) &>/dev/null
现在在某些主机中,当主机关闭时,此命令将花费很长时间(例如3分钟)报告失败。
如果主机没有响应,我将为此命令添加超时支持并使其快速返回(例如,在5秒内返回)。
SSH_CMD="(: </dev/tcp/$vm_ip/22) &>/dev/null"
timeout --preserve-status 5 $SSH_CMD
但是,上面会输出错误:
timeout: failed to run command ‘(:’: No such file or directory
你能帮我解决这个问题吗?
==编辑1 ==================
尝试像这样更改代码(不定义变量):
timeout --preserve-status 2 (: </dev/tcp/$vm_ip/22) &>/dev/null
失败的是:
./test.sh: line 45: syntax error near unexpected token `('
./test.sh: line 45: ` timeout --preserve-status 2 (: </dev/tcp/$vm_ip/22) &>/dev/null'
答案 0 :(得分:1)
命令中的括号是子shell的shell语法,但timeout
不运行它通过shell启动的命令。相反,它直接运行它。它将(:
视为命令名称并尝试运行它,这会导致错误,因为您在PATH
中不太可能有这样的命令。
你需要在那里添加一个明确的shell,如下所示:
timeout --preserve-status 5 bash -c "(: </dev/tcp/$vm_ip/22) &>/dev/null"
您的第二个命令行会出现语法错误,因为(
和)
是shell中的特殊标记。该命令行还会将重定向应用于timeout
本身,因此在timeout
开始之前就会打开网络连接。
你可以引用那里的单词,即timeout ... "(:"
等,但这只会得到与timeout ... $SSH_CMD
相同的结果。
我还不确定你是否需要子shell,但你仍然需要在timeout
下运行一个shell,以便在超时运行时处理重定向。
答案 1 :(得分:-1)
在新脚本中调用旧脚本,如下所示:
timeout --preserve-status 5 name-of-old-script