第1章-小试牛刀(14持续运行命令直至执行成功)

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

1.15.1实战演练

定义如下函数:

repeat()
{
  while true
  do
      $@ && return
  done
}
或者把它放入shell的rc文件,更便于使用:
repeat() { while true; do $@ && return; done }

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

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

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

2、 加入延迟
假设你要用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秒 才运行一起。

你可能感兴趣的:(第1章-小试牛刀(14持续运行命令直至执行成功))