unix功能:crontab
介绍
unix
crontab 是 Unix 系统上用于定时执行任务的一个工具和服务,其中 crontab 表示cron table
,即允许用户编辑一张表来定义周期性执行的任务,其中 cron 是系统后台运行的守护进程:
1 | [root@VM-16-12-opencloudos ~]# ps -ef|grep cron|grep -v grep |
通过 crontab,使用者可以实现如下的功能:
- 定时执行任务:如备份文件、发送邮件、系统维护等操作
- 任务计划管理:通过 crontab 各种命令来对定时任务进行增删改查操作
- 日志记录:通过重定向日志来进行后续的排查或查看
下面是一些常用的 crontab 命令行命令说明:
1 | # a. 列出当前用户的所有的定时任务 |
如果希望编辑一条新的 crontab 任务,通过crontab -e
就可以编辑用户所属的任务计划文件并在其中进行添加任务,在 linux 系统中 root 用户的 crontab 任务一般存放在/var/spool/cron/root
中。
Mac
不建议使用 crontab, 建议使用launchd,如果希望在 mac 中使用 crontab,则 shell 需要做如下的配置:
1 | alias crontab="VIM_CRONTAB=true crontab" |
为了确保crontab -e
能够通过 vim 进行正常编辑,在 vimrc 做配置:
1 | if $VIM_CRONTAB == "true" |
命令
crontab 文件中每一行表示一个任务,他们分别表示分钟、小时、天、月份、星期、命令,具体字段说明如下:
1 | * * * * * command_to_execute |
对于F1~F5
,他们可以使用特殊的符号达到类似正则的效果,这些特殊符号如下
*
数字范围内每单位时间/
代表“每”的含义,例如”/5”表示每 5 个单位-
代表从某个数字到某个数字的范围,
离散的时间点(例如,18-19, 22, 23, 表示每天的 18-19, 22, 23 点), 注意不能有空白分隔符
例如:
- *,表示每单位时间执行一次脚本,例如每一分钟/每一小时/每一天;
a-b
表示在指定的时间范围内,每单位时间执行一次脚本,例如每天的12-18
点,此时默认a-b/n
中 n 的值为 1;/n
表示每 n 个单位时间内执行一次脚本,因为默认情况下都是每单位时间,所以这个非常重要a, b, c, d
表示在某一个时间点执行一次脚本,离散的时间点
日志和异常
日志
- 在 ubuntu 环境中开启日志
1 | # 开启日志 |
- linux 系统下的 crontab 日志查看
1 | # Linux |
异常处理
- 时间差问题
在运行 crontab 执行某一个 django command 进行报表备份时,发现白天执行 CMD 时时正常的,但是在夜间 crontab 脚本自动执行时并没有任何信息输出。最终排查原因为:datetime 和 timezone 的时间差,cron
服务按照系统的时区来调度作业,然后脚本中的时区可能同系统时区不一致,最终导致两者的时间不一致。下面是错误的 python 示例代码:
1 |
|
- 中文处理
在 crontab 下的运行环境已经与用户 shell 环境不同, 此时需要设置 LANG, 确保脚本中包含中文时能够正常进行:
- 获取 shell 的 LANG: echo $LANG
- 脚本中设置 LANG: export LANG=xxxxs
否则,在处理中文的时候会碰到问题
邮件
在执行 crontab 过程中,如果发生失败,会默认向本机发送 Mail 以告知具体的情况,出错情况如下:You have new mail,此时可以查看:mail/mailx,并执行各种命令来查看邮件信息,该邮件所在目录一般为:
- /var/mail/$USER
- /var/spool/mail/$USER
示例
- 指定具体的时间点,有一个明确的时分秒
1 | # 每天的23点59分执行一次 |
- 间隔时间
1 | # 每5分钟执行一次(注意, 此时不能指定hour, 无意义) |