我想运行一个命令直到它成功完成,然后停止。我知道我可以设置一个 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
您可以在此处或此处添加错误条件,但重要的是,一旦您确认端口已打开,就立即连接,这就是 && 操作的目的 - 如果前一个命令成功,它将执行下一个命令。(在此之前,失败的连接将返回非零退出代码,这将导致循环继续)。一旦您成功登录然后注销,从该成功登录会话返回的退出代码将终止循环。
(睡眠命令是可选的,但请注意,在某些情况下,如果没有睡眠循环,您的显示速度可能会变慢,直到您将其最小化或切换到下一个窗口,如果您的显示器是远程桌面,这可能会出现问题)