cron是一个Linux定时执行工具,可以在无需人工干预的情况下运行作业。在Ubuntu server 下,cron是被默认安装并启动的。
通过/etc/crontab文件,可以看到以下内容:
root@storage:/etc/cron.hourly# cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
root@storage:/etc/cron.hourly#
ununtu 通过调用 run-parts 命令,定时运行四个目录下的所有脚本。
- /etc/cron.hourly,目录下的脚本会每个小时让执行一次,在每小时的2分钟时运行;
- /etc/cron.daily,目录下的脚本会每天让执行一次,在每天0点17分时运行;
- /etc/cron.weekly,目录下的脚本会每周让执行一次,在每周第七天的3点56分时运行;
- /etc/cron.mouthly,目录下的脚本会每月让执行一次,在每月19号的5点32分时运行;
当然,以上的时间均是系统默认时间,可以根据自己的需求进行修改。
crontab 命令格式
crontab [ -u user ] [ -i ] { -e | -l | -r } //省略用户表示操作当前用户的crontab
(默认操作是 replace)
-e (编辑用户的工作表)
-l (列出用户的工作表)
-r (删除用户的工作表)
-i (在删除用户的crontab文件时给确认提示)
首次使用 crontab 时,提示用户选择编辑器,如果选择错了可以执行 select-editor 命令重新选择
root@ubuntu:# crontab -e
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4 [2]: 3
root@B-OPS-68-1:~#
crontab 任务配置编写
crontab -e 进入当前用户的工作表编辑
crontab 的配置语法为 时间+动作,其时间有分、时、日、月、周 五种,每个时间注意用空格分开,动作就是你要执行的命令
minute(m) | hour(h) | day of month(dom) | month(mon) | day of week(dow) | action |
---|---|---|---|---|---|
0-59 | 0-23 | 1-31 | 1-12 | 0-6 | command |
其中时间还可以使用下列特殊字符,更细致的设置时间
- (*) 星号代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作
- (,) 可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
- (-) 可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
- (/) 可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
run-parts 系统默认的 hourly daily weekly monthly 四类定时任务不执行问题的解决
脚本文件需满足以下的条件
- 脚本文件名的有效字符为 [a-zA-Z0-9_-] ,并且脚本文件不允许有扩展名
- 脚本文件内容第一行必须有正确的文件头 #!/bin/bash
脚本文件完成后,使用 run-parts 进行测试
run-parts --test /etc/cron.hourly
如果测试结果显示之前配置的脚本文件名,则表明它可以工作。否则,如果不显示任何内容,则脚本无效。