如果条件是真的,睡5分钟的定时任务

我有一个脚本设置每分钟后运行。 但是在我们提到的脚本中,如果条件成立,脚本必须睡5分钟。 这怎么会影响crontab? 脚本是否会进入睡眠模式5分钟,或者它会每隔1分钟在crontab中设置一次?

你有两个select来获得这个。 通常情况下,cron不关心作业的前一个实例是否仍在运行。

选项1:

在脚本的开头写入一个locking文件,并在完成时删除它。 然后在脚本的开始处检查文件是否存在,如果是,则脚本结束而不做任何事情。 例如,这可能是这样的:

# if the file exists (`-e`) end the script: [ -e "/var/lock/myscript.pid" ] && exit # if not create the file: touch /var/lock/myscript.pid ... # do whatever the script does. # if condition sleep 300 # wait 5 min ... # remove the file when the script finishes: rm /var/lock/myscript.pid 

选项2:

这也是一个好办法。 这叫做run-one 。 从手册:

运行一个 – 在一些命令和唯一的一组参数下运行一个实例(对cronjobs有用,例如)

cronjob然后可能看起来像这样:

 * * * * * /usr/bin/run-one /path/to/myscript 

我做了类似的事情 – 如果发生了什么事情,暂停脚本,但是我没有从cron运行它。 相反,我有一个不断重新运行的shell脚本。 就我而言,我检查了平均负载,如果太高,暂停一分钟。 这是可以的,我做了我需要的东西,然后暂停了很短的时间。

这也有双重优势,只有一个脚本可以运行,并且也可以比每分钟更频繁地重新运行它,这是最小的cron频率。

 #!/bin/bash i_should_sleep() { if [ *condition* ] then return 0 else return 1 fi } if i_should_sleep; then sleep 300 exec $0 $@ fi nice COMMAND # run the action we really want to do sleep 60 # or less than a minute, to run more often exec $0 $@ 

要启动它,你可以创build一个Upstart或者init.d作业,或者类似的东西。

使用crontab,你不能这样做,但是你可以用脚本的一些扩展来做到这一点。 我正在考虑下面的伪代码:

 #!/bin/bash if ...temporary_file_exists then if ...tmp_is_older_as_5_minute... then delete tmp else exit fi fi ... if "${condition}" then touch $temporary_file exit fi ...normal behavior of your script... 

它能做什么? cron脚本的主要问题是,你不能在它们的运行之间轻松地存储一个持久的内存。 您需要使用临时方法来执行此操作。 在Unix脚本世界中,临时文件是非常常见的解决scheme,您可以使用临时文件的存在(以及更改时间)来了解实际情况。