Linux crontab语法和速查
- 2024-11-07 21:01:00
- 丁国栋
- 原创 380
本文主要介绍如何添加或修改crontab里的计划任务。
基本格式:minute hour day month week command,即:分钟 小时 天 月 周 命令
注意:如果 command 不在 标准 PATH 中,需要先指定 PATH 变量的内容。
比如:
PATH=/opt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 1 7 * * * COMMAND_NOT_IN_STD_PATH
注:除了可以指定 PATH,还可以指定 SHELL 变量来指定需要使用哪一个 shell 来执行命令。如 SHELL=/bin/bash。
注意:crontab 文件(crontab -e编辑时等效)的最后一行必须带换行符(a newline before EOF),否则可能会提示无法安装这个crontab。
注意:使用计划任务要充分考虑命令或脚本是否能在计划任务周期内完成,比如每小时运行一个计划任务,要充分考虑它能否在一小时内完成,如果可能完成不了就一定要使用排他锁。例如 flock--verbose -xn /path/to/lockfile。
分支持的格式:
- * 每分钟
- , 某几分钟,比如1,5 表示在第1分钟和第5分钟
- - 某连续几分钟,比如 1-5 表示从第1分钟到第5分钟
- / 每几分钟,例如 */5 表示每五分钟
- 0-59 允许的数值区间为0-59
小时支持的格式:
- * 每小时
- , 某几小时,比如1,5 表示在第1小时和第5小时
- - 某连续几小时,比如 1-5 表示从第1小时到第5小时
- / 每几小时,例如 */5 表示每五小时
- 0-23 允许的数值区间为0-23
天支持的格式:
- * 每天
- , 某几天,比如1,5 表示在第1天和第5天
- - 某连续几天,比如 1-5 表示从第1天到第5天
- / 每几天,例如 */5 表示每五天
- 1-31 允许的数值区间为1-31
月支持的格式:
- * 每月
- , 某几月,比如1,5 表示在第1月和第5月
- - 某连续几月,比如 1-5 表示从第1月到第5月
- / 每几月,例如 */5 表示每五月
- 1-12 允许的数值区间为1-12
- JAN-DEC 可以使用月的单词的前三个字母表示具体某个月
周支持的格式:
- * 每天
- , 周几,比如1,5 表示在周一和周五
- - 连续周几,比如 1-5 表示从周一到周五
- / 每隔几天,例如 */5 表示每周的第5天
- 0-6 允许的数值区间为0-6,0表示周
- SUN-SAT 可以使用周的单词的前三个字母表示具体某个周(国外一般认为周日是每周的第一天)
有个有用的网站可以参考,只是是英文的:https://crontab.guru ,这个网站可以形象的表示出crontab的执行计划以及列出下次执行的时间,可谓是非常清楚。
尽管有的 cron 执行日志会输出到 syslog 中,但最好还是使用 sudo journalctl -u cron.service 来查看。
cron 日志提示: (CRON) info (No MTA installed, discarding output),这是说因为没有安装MTA(mail transport agent)所以计划任务执行程序的输出被丢弃,此时可以安装 postfix 等 mta。也可以修改 crontab 将程序的输出重定向到文件。
设置计划任务的一些技巧:
- 计划任务执行的程序的输出重定向到文件;
- 重定向的文件不要写入 /tmp 以免被清理,建议重定向到其他数据目录;
- 如果不想将计划任务执行的程序的输出重定向到文件,安装邮件客户端来辅助代替,便于问题跟踪;
- 可以在 crontab 中设置一些环境变量比如 SHELL、 PATH、 MAILTO、 TZ 等,注意不要使用
~这样依赖shell参数展开的用法; - 避免在 crontab 中使用shell表达式;
- 进一步阅读
man 5 crontab会有一些额外的收获或帮助; - 调用的可执行程序必须使用绝对路径,避免因为PATH路径不同导致的未找到或者版本不对;
--