Bash Shell第N天运行脚本

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 号,我们只需要在此期间每天都运行作业并检查当天是否为周三。如果是,则执行指定的命令。

每月各周的日期范围

Bash Shell第N天运行脚本

我们知道这看起来也太过简单了。要是不信的话,你可以查看日历。

$ 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
$

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!