Bash Shell第N天运行脚本,你想在每月的第 N 天(如第 2 个周三)运行脚本,但大多数 cron 无法实现。
解决方案
在要执行的命令中加点 shell 代码。在 Linux 的 Vixie-cron crontab 中,选用以下任意一行。如果用的是其他 cron 程序,可能得根据 cron 使用的调度方式将星期几的名称转换成数字(0-6 或 1-7),并用 +%w
(数字形式的星期几)代替 +%a
(所在语言环境下的缩写形式的星期几)。
# Vixie-cron
# Min Hour DoM Mnth DoW Program
# 0-59 0-23 1-31 1-12 0-7
# Vixie-cron要求转义%,否则会报错!
# 在第1个周三的23:00运行
00 23 1-7 * Wed [ "$(date '+\%a')" == "Wed" ] && /path/to/command args to command
# 在第2个周四的23:00运行
00 23 8-14 * Thu [ "$(date '+\%a')" == "Thu" ] && /path/to/command
# 在第3个周五的23:00运行
00 23 15-21 * Fri [ "$(date '+\%a')" == "Fri" ] && /path/to/command
# 在第4个周六的23:00运行
00 23 22-27 * Sat [ "$(date '+\%a')" == "Sat" ] && /path/to/command
# 在第5个周日的23:00运行
00 23 28-31 * Sun [ "$(date '+\%a')" == "Sun" ] && /path/to/command
注意,一周中的某一天未必总会在一个月内出现 5 次,因此,如果计划在每月的第 5 周执行某项任务,请务必确保清楚自己的需求。
也要注意另一件事,Vixie-cron 要求转义 %
,否则就会得到类似“Syntax error: EOF in backquote substitution”的错误。其他版本的 cron 对此可能不做要求,最好还是检查一下相关手册页。
如果 cron 看起来好像不正常,尝试重启你的 MTA(Mail Transfer Agent,即邮件传输代理,如 sendmail)。有些系统上的某些 cron 版本(如 Red Hat 上的 Vixie-cron)是和 sendmail 进程捆绑在一起的。
讨论
大多数版本的 cron(包括 Linux 的 Vixie-cron)不允许你在每个月的第 N 天安排作业。为了解决这个问题,我们将作业安排在第 N 天所在的日期范围内,然后检查日期是否正确,以此决定是否执行命令。“每月的第 2 个周三”肯定出现在这个月的 8~14 号,我们只需要在此期间每天都运行作业并检查当天是否为周三。如果是,则执行指定的命令。
每月各周的日期范围
我们知道这看起来也太过简单了。要是不信的话,你可以查看日历。
$ cal 10 2006
October 2006
S M Tu W Th F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
$
酷客网相关文章:
评论前必须登录!
注册