我有一份crontab作业,工作时间为星期一至星期五,但我需要它来排除特定日期的例外情况,例如1月1日,4月11日等。
如何在crontab作业中做出该异常?
* * * * 1-5 ./full-backup
最佳答案
最简单的方法是使用and
或or
列表序列。
man sh
:AND和OR列表是分别由&&
和||
控制运算符分隔的多个管道之一的序列。 AND和OR列表以左关联性执行。
AND列表的格式为command1 && command2
。
仅当command2
返回退出状态为零时,才会执行command1
。
OR列表的格式为command1 || command2
。仅当command2
返回非零退出状态时,才会执行command1
。
如果您想从自己的计划中排除2天,比如说1月1日和4月11日,那么您可以执行以下操作:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
* * * * 1-5 [ `date '+\%m\%d'` == "0101" ] || [ `date '+\%m\%d'` == "0411" ] || ./full_backup.sh
从您有更多的日子来排除它开始,这将变得有些棘手。您可以使用较小的脚本,例如
excludedaycmd
#!/usr/bin/env bash
while [[ $1 != "" ]]; do
[[ $(date "+%m%d" )) == $1 ]] && exit 1
shift
done
exit 0
如果该脚本的任何参数适合一天,则它将以1退出。您的cron看起来会像。
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
* * * * 1-5 excludedaycmd 0101 0411 && ./full_backup.sh
任何其他脚本也可以任何其他形式使用。
关于linux - Crontab天异常(exception)Linux,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48818748/