我目前面临的一个 cron 文件包含十几个不同的应用程序的任务——有些只有一个,有些有很多。我正在尝试找出一种组织和记录这些过程的好方法。有没有什么惯例可以模仿,还是我只能自己想办法?
答案1
#minute hour mday month wday who command
## Acme Anvil Application
# clear logs every 5 minutes
*/5 * * * * root /path/to/clear_logs
# monthly maintenance
30 5 1 * * root /path/to/acme/maintenance
## Fabricam
# adjust timing
*/30 0-5 * * * fab /path/to/bin/fab_time
## Etc...
答案2
如果您的系统支持 /etc/cron.d,您也可以尝试将 cron 作业分解为单独的文件,并按应用程序分组。
root@linuxbox:/etc/cron.d# ls
sa-update sysstat vnstat
请注意,/etc/cron.d 中的 cron 作业格式略有不同,因为您需要将运行命令的用户放在时间字段和命令本身之间,例如,
root@linuxbox:/etc/cron.d# cat sa-update
### OPTIONAL: Spamassassin Rules Updates ###
#
# http://wiki.apache.org/spamassassin/RuleUpdates
# Highly recommended that you read the documentation before using this.
# ENABLE UPDATES AT YOUR OWN RISK.
#
# /var/log/sa-update.log contains a history log of sa-update runs
10 4 * * * root /usr/share/spamassassin/sa-update.cron 2>&1 | tee -a /var/log/sa-update.log
答案3
我建议确保在 /etc/crontab 文件末尾添加注释。如果文件中的最后一个作业未以换行符结尾,则许多 cron 实现都不会触发该文件中的最后一个作业。
Debian Lenny 就是其中之一。
答案4
好问题。以下几点让我受益匪浅:
0)标题注释
添加有用的评论,这将有助于您编写条目,并减少作业无法按预期进行的机会。
##------------------------------------------------------------
## (-) Characters to escape: %, $
## (-) Logs (on Linux) are located under /var/spool/mail/ (postfix needs to be installed)
##
## Min Hour Day Mon Weekday
## * * * * * command to be executed
## ┬ ┬ ┬ ┬ ┬
## │ │ │ │ └─ Weekday (0=Sun .. 6=Sat)
## │ │ │ └────── Month (1..12)
## │ │ └─────────── Day (1..31)
## │ └──────────────── Hour (0..23)
## └───────────────────── Minute (0..59)
##
##------------------------------------------------------------
1)订单
按一天中的时间对条目进行排序(早上在顶部,晚上在底部)
- 原因:更容易找到您想要调整的条目。
2)路径
在文件顶部明确设置 PATH
- 理由:避免“没有这样的文件或目录”错误(特别是如果您需要 GNU 版本的工具而不是 Mac 内置版本!)
SHELL=/bin/zsh
PATH=/Volumes/apps/homebrew/Cellar/findutils/4.9.0/libexec/gnubin/:/Volumes/apps/homebrew/Cellar/coreutils/9.1/libexec/gnubin/:/Volumes/apps/homebrew/Cellar/findutils/4.9.0/libexec/gnubin/:/opt/local/bin/:
3)限制 sh /path/to/script.sh
除非真的需要,否则不要调用脚本(最好直接在 crontab 文件中调用原语)
- 理由:你可以快速找到负责特定行为的条目
4)备份 crontab
添加以下条目(在 root 的 crontab 中执行相同操作):
@weekly crontab -l > ~/crontab.`whoami`.`date -I`.txt
- 原因:无论何时重新安装操作系统,您都无法轻松重建 crontab。
5)| tee /tmp/cron_*log
将每个条目的输出写入 ramdisk 上的日志文件;
| tee /tmp/cron_*.log
| tee /tmp/cron_*.err.log
理由:
- 更容易找到 cron 中的错误(例如
tail /tmp/cron_*.err.log
) - 垃圾日志文件不会超出其使用寿命
- 无需使用内置的 /var/mail/messages,因为它会变得臃肿
6)cron 表达式后的 tab
- 理由:一些 cron 表达式会比其他表达式更长,因此在同一字符列中启动所有命令会看起来更整洁(并帮助您比较不同的命令)
6 12 * * 5 echo "hello"
10 12 * * 1-5 echo "world"
其他
- 每年从一个空白的 crontab 开始(以便定期清除垃圾)