运行命令直到它不再失败

运行命令直到它不再失败

我想运行一个命令直到它成功完成,然后停止。我知道我可以设置一个 bash 循环来执行此操作,但我很好奇是否有任何可移植的方法来执行此操作,类似于watch -n5我想要的。

用例:我正尝试通过 SSH 连接到可能尚未启动的服务器。

答案1

只需将上述 bash 循环包装在脚本中,用于$1指定要执行的实际命令和$2任意睡眠值。这样做,您就可以像这样运行命令:

$ reallyrunit "ls" 5

答案2

#xxx.xxx.xxx.xxx = ipaddr ssh 主机
直到 [`nmap --open -p 22 xxx.xxx.xxx.xxx |grep -c "ssh"` -eq 1]
睡眠 4
完毕

# ssh 内容在这里

答案3

我不知道有没有内置这样的功能,但是要使用的 bash 是这样的:

RET=1;until [[ $RET = 0 ]];do echo "$(date): About to make an attempt to connect"; ssh 192.168.33.12; RET="$?";sleep 1;done

编辑:添加日期和评论,以便您可以跟踪其失败的时间。

答案4

您可以将退出值设置为非零值,然后循环直到命令返回 exit 0(成功)。这是我的一个脚本,它可以执行此操作:

#!/bin/sh

cd /exports/home/exports/sl
$(exit 1)


while [ $? != 0 ]; do rsync -avlH --delete  --exclude=6.1/archive --exclude=6.1/i386/archive --exclude=6.1/x86_64/archive --exclude=6.1/i386/iso --exclude=
6.1/x86_64/iso rsync://rsync.gtlib.gatech.edu/scientific/6.1 6.1/; done

这不是最好的脚本——它更像是一个思想实验,确保 rsync 在失败时重新启动,直到成功完成。

编辑:就你的情况而言,你可能需要类似以下的东西:

#!/bin/sh

$(exit 1) ; while [ $? != 0 ]; do sleep 1 ; nc -vvv  -z 192.168.15.37 22  && ssh 192.168.15.37  ; done

您可以在此处或此处添加错误条件,但重要的是,一旦您确认端口已打开,就立即连接,这就是 && 操作的目的 - 如果前一个命令成功,它将执行下一个命令。(在此之前,失败的连接将返回非零退出代码,这将导致循环继续)。一旦您成功登录然后注销,从该成功登录会话返回的退出代码将终止循环。

(睡眠命令是可选的,但请注意,在某些情况下,如果没有睡眠循环,您的显示速度可能会变慢,直到您将其最小化或切换到下一个窗口,如果您的显示器是远程桌面,这可能会出现问题)

相关内容