Shell 持续运行命令直至执行成功

Shell 持续运行命令直至执行成功,有时候命令只有在满足某些条件时才能够成功执行。例如,在下载文件之前必须先创建该文件。这种情况下,你可能希望重复执行命令,直到成功为止。

Shell持续运行命令直至执行成功

实战演练

定义如下函数:

repeat()
{
  while true
  do
    $@ && return
  done
}

或者把它放入shell的rc文件,更便于使用:

repeat() { while true; do $@ && return; done }

工作原理

函数repeat()中包含了一个无限while循环,该循环执行以函数参数形式(通过$@访问)传入的命令。如果命令执行成功,则返回,进而退出循环。

补充内容

我们已经知道了用于重复执行命令,直到其执行成功的基本做法。接着来看看更高效的方式。

  1. 一种更快的做法
    在大多数现代系统中,true是作为/bin中的一个二进制文件来实现的。这就意味着每执行一次之前提到的while循环,shell就不得不生成一个进程。为了避免这种情况,可以使用shell的内建命令:,该命令的退出状态总是为0:
repeat() { while :; do $@ && return; done }

尽管可读性不高,但是肯定比第一种方法快。

  1. 加入延时
    假设你要用repeat()从Internet上下载一个暂时不可用的文件,不过这个文件只需要等一会就能下载。一种方法如下:
repeat wget -c http://www.example.com/software-0.1.tar.gz

如果采用这种形式,会产生很多发往www.example.com的流量,有可能会对服务器造成影响。(可能也会牵连到你自己;如果服务器认为你是在向其发起攻击,就会把你的IP地址列入黑名单。)要解决这个问题,我们可以修改函数,加入一段延时:

repeat() { while :; do $@ && return; sleep 30; done }

这样命令每30秒才会运行一次。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程