运行一个命令,直到停止失败

我想运行一个命令,直到它成功完成,然后停止。 我知道我可以设置一个bash循环来做到这一点,但我很好奇,如果有任何便携的方式来做类似的watch -n5 ,会做我想要的。

用例:我试图通过SSH连接到可能还没有启动的服务器。

只需将所述bash循环包装在一个脚本中,使用$1指定要执行的实际命令,使用$2作为任意的睡眠值。 这样做,你将能够运行如下命令:

 $ reallyrunit "ls" 5 
  #xxx.xxx.xxx.xxx = ipaddr ssh主机
直到[`nmap --open -p 22 xxx.xxx.xxx.xxx | grep -c“ssh”`-eq 1]
做 
睡4
 DONE 

 #ssh的东西在这里

我不知道这样的内置,但使用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 

编辑:添加date和评论,所以你可以跟踪它已经失败了多久。

我会在一个bash循环中构造这个。 我想你也可以轮询系统(ping,nmap或其他)来确定服务状态,如果成功则连接。

您可以将退出值设置为非零值,然后循环,直到命令返回,退出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 

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

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