在Linux或类Unix系统中,通常使用 crontab
命令在指定的时间执行一个shell脚本或者一系列Linux命令,也就是通常所说的定时任务。
一、cron 进程
在详细介绍crontab之前,必须要说一下 cron 进程
。
1、cron进程是linux中的守护进程,在系统后台运行,它会(默认每分钟)持续地检查/etc/crontab
文件、/etc/cron.*/
目录、/var/spool/cron/
目录,读取调度任务并执行。
2、所有用户创建的crontab文件都保存在/var/spool/cron/
目录,被cron服务定时检查。
二、crontab命令:
crontab
命令可以用来创建、编辑、查询、删除定时任务。
通过 crontab
命令,每个用户都可以编辑或者配置自己的定时任务,并拥有自己的 crontab 文件。
1、创建/编辑 crontab 文件
在 linux 命令行中输入crontab -e, 即可创建或编辑用户自己的crontab文件:
crontab -e
当crontab文件不存在时,即为创建;已存在时即为编辑;
此时,可以输入具体的crontab命令,用来增加、修改或删除当前用户的某一项任务。
<font color=red>在crontab文件中,每一行命令代表一个定时任务!</font>
2、crontab 语法(字段介绍)
crontab -e之后,即可输入crontab命令,具体语法如下:
1 2 3 4 5 /path/to/command arg1 arg2
或者:
1 2 3 4 5 /root/ntp_sync.sh
各字段的格式:
{minute} | {hour} | {day-of-month} | {month} | {day-of-week} | {full-path-to-shell-script} |
---|---|---|---|---|---|
分钟 (0-59) | 小时 (0-23) | 日期 (1-31) | 月份 (1-12) | 一周当中的某天 (0-7 [7 或 0 代表星期天]) | 计划执行的脚本或命令的完整路径 |
3、crontab 命令示例
<font color=red>(结合第4部分的操作符使用方法一起学习)</font>
# 每隔 5 分钟运行一次 backupscript 脚本 ##
*/5 * * * * /root/backupscript.sh
### 每天的凌晨 1 点运行 backupscript 脚本 ##
0 1 * * * /root/backupscript.sh
### 每月的第一个凌晨 3:15 运行 backupscript 脚本 ##
15 3 1 * * /root/backupscript.sh
### 每个工作日(Mon – Fri) 11:59 p.m 都进行备份作业。
59 23 * * 1,2,3,4,5 /root/bin/backup.sh
或者:
59 23 * * 1-5 /root/bin/backup.sh
### 每周六、周日的3点10分执行hello.sh
10 3 * * 0,6 hello.sh
### 晚上11点到早上8点之间每两个小时,及每天早上八点,输出信息到文件中
0 23-7/2,8 * * * echo "have a good dream:)" >> /tmp/test.txt
### 每个月的4号与每个礼拜的礼拜一到礼拜三的早上11点执行命令
0 11 4 * 1-3 command
可以把经常要做的一些事放到其中,简化工作量,如每周一检查服务器的运行状态,查看报告,杀掉一些进程等等……
4、crontab 命令辅操作符
操作符允许为一个字段指定多个值,这里有三个操作符可供使用:
<font color=red>星号 (
*
) </font>: 代表任何时刻- 举个例子,在小时字段中,一个星号等同于每个小时;在月份字段中,一个星号则等同于每月。
- <font color=red>逗号 (
,
) </font>: 在一个字段上指定多个值,例如:1,5,10,15,20,25 <font color=red>横杠 (
-
) </font>: 指定了一个值的范围- 例如:5-15 ,等同于使用逗号操作符键入的 5,6,7,8,9,…,13,14,15。
<font color=red>分隔符 (
/
) </font>: 代表‘每’,/n表示每隔n单位间隔- 例如:小时字段为*/5 表示每5小时,也可以写成0-23/5,意思一样。其它字段也是类似的。
5、crontab 查看和删除某用户所有的定时任务
crontab -l # 默认查看当前用户的所有定时任务
# 使用-u 参数查看指定用户的定时任务,需要以root用户身份执行
crontab -u username -l
crontab -r # 删除当前用户的crontab的所有任务内容,慎用!
### 删除指定用户名下的定时任务,需要以 root 用户身份执行,慎用!
crontab -r -u username
6、禁用邮件输出
默认情况下,某个命令或者脚本的输出内容(如果有的话)会发送到你的本地邮箱账户中。若想停止接收 crontab 发送的邮件,需要添加 >/dev/null 2>&1 这段内容到执行的命令的后面,例如:
0 3 * * * /root/backup.sh >/dev/null 2>&1
7、使用特殊字符串
linux中提供了以下 8 个特殊字符串,可以用来替代crontab命令的前五个字段,这样不但可以节省时间,还可以提高可读性。
特殊字符 | 含义 |
---|---|
@reboot | 在每次启动时运行一次 |
@yearly | 每年运行一次, 等同于 “0 0 1 1 *” |
@annually | (同 @yearly) |
@monthly | 每月运行一次, 等同于 “0 0 1 ” |
@weekly | 每周运行一次, 等同于 “0 0 0” |
@daily | 每天运行一次, 等同于 “0 0 *” |
@midnight | (同 @daily) |
@hourly | 每小时运行一次, 等同于 “0 ” |
示例:
## 每小时运行一次 ntpdate 命令
@hourly /path/to/ntpdate