运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大家喜欢。
今天我们要讲的是 Crontab。
一、简介
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于crontab文件中,以供之后读取和执行。
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
Min Hour Day Mon Weekday
* * * * * command to be executed
┬ ┬ ┬ ┬ ┬
│ │ │ │ └─────────── Day of Week (0=Sun .. 6=Sat)
│ │ │ └───────────── Month (1..12)
│ │ └──────────────── Day of Month (1..31)
│ └────────────────── Hour (0..23)
└───────────────────── Minute (0..59)
Field | Range | Special characters |
Minute | 0 - 59 | , - * / |
Hour | 0 - 23 | , - * / |
Day of Month | 1月31日 | , - * ? / L W |
Month | 1月12日 | , - * / |
Day of Week | 0 - 6 | , - * ? / L # |
二、操作命令
cron 是 linux 的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
# 操作系统为Linux 7版本及以上:
systemctl start crond #启动服务
systemctl stop crond #关闭服务
systemctl restart crond #重启服务
systemctl reload crond #重新载入配置
systemctl status crond #查看crontab服务状态
systemctl enable crond #开启开机自动启动
systemctl disable crond #禁止开机自动启动
# 操作系统为Linux 7版本以下:
/sbin/service crond start #启动服务
/sbin/service crond stop #关闭服务
/sbin/service crond restart #重启服务
/sbin/service crond reload #重新载入配置
ntsysv #查看crontab服务是否已设置为开机启动
chkconfig –level 35 crond on #开机自动启动
三、用户任务调度文件
用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
四、使用者权限文件
- 文件:/etc/cron.deny,说明:该文件中所列用户不允许使用crontab命令
- 文件:/etc/cron.allow,说明:该文件中所列用户允许使用crontab命令
- 文件夹:/var/spool/cron/,说明:所有用户crontab文件存放的目录,以用户名命名
- /etc/cron.deny和/etc/cron.allow这两个使用控制文件的格式都是每行一个用户, 两个文件都不允许空格。
- 如果使用控制文件被修改了,cron 守护进程(crond)不必被重启。
- 使用控制文件在每次用户添加或删除一项 cron 任务时都会被读取。
- 无论使用控制文件中的规定如何,root 都总是可以使用 cron。
- 如果 cron.allow 文件存在,只有其中列出的用户才被允许使用 cron,并且 cron.deny 文件会被忽略。
- 如果 cron.allow 文件不存在,所有在 cron.deny 中列出的用户都被禁止使用 cron。
五、命令参数
- -u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
- -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
- -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
- -r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
- -i:在删除用户的crontab文件时给确认提示。
六、使用实例
表达式 | 说明 |
*/15 * * * * | Every 15 mins |
0 * * * * | Every hour |
0 */2 * * * | Every 2 hours |
15 2 * * * | At 2:15AM of every day |
15 2 * * ? | At 2:15AM of every day |
10 9 * * 5 | At 9:10AM of every Friday |
0 0 * * 0 | At midnight of every Sunday |
15 2 * * 1L | At 2:15am on the last monday of every month |
15 0 * * 4#2 | At 00:15am on the second thursday of every month |
0 0 1 * * | Every 1st of month (monthly) |
0 0 1 1 * | Every 1st of january (yearly) |
@reboot | Every reboot |
@yearly | Run once every year, "0 0 1 1 *" |
@annually | (same as @yearly) |
@monthly | Run once every month, "0 0 1 * *" |
@weekly | Run once every week, "0 0 * * 0" |
@daily | Run once each day, "0 0 * * *" |
@midnight | (same as @daily) |
@hourly | Run once an hour, "0 * * * *" |
七、小窍门
1. 快速添加crontab,适用于通过脚本批量操作:
echo "@reboot echo hi" | crontab
2. crontab执行shell时,只能识别为数不多的环境变量,普通的环境变量是无法识别的,所以在编写shell时,最好使用export重新声明变量,确保脚本执行。
3. 定时任务添加注释,以便于其他人查看是什么任务。
4. 避免不必要的程序以及命令输出。
5. 推荐一个可以帮我们解读表达式的定时语句解析工具:https://crontab.guru/
6. 如果命令在控制台执行成功,而在crontab执行失败,我们需要考虑是否命令涉及的环境变量在crontab和控制台间存在差异。
7. /var/log/cron 日志中包含任务执行记录,配置错误提示,任务配置编辑重载记录,服务开启等记录。
8. 新创建的crontab任务,不会马上执行,至少要过2分钟才行。如果重启crontab则马上执行。