在Linux中,crontab是用来管理定期执行任务的命令。定时任务的执行依赖于Linux上的crond服务,这个服务启动后会每分钟去检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。crond和crontab两者是不可分割的概念。
注意:新创建的 cron 任务,不会马上执行,至少要过2分钟后才可以,当然你可以重启crond服务来马上执行。
查看系统是否安装crontab
使用命令rpm -qa | grep crontab
可以检查系统是否安装crontab。1
2[root@localhost ~]# rpm -qa | grep crontab
crontabs-1.11-6.20121102git.el7.noarch
如果系统上没有安装crontab,则可以通过如下命令安装:1
2yum -y install vixie-cron
yum -y install crontabs
crond服务的启动与停止
crond服务启动、停止的命令如下:1
2
3
4systemctl status crond # 查看服务状态
systemctl stop crond # 停止服务
systemctl start crond # 启动服务
systemctl reload crond # 重新加载配置
全局配置文件
crontab相关的配置文件是位于/etc
目录下面的cron.hourly
,cron.daily
,cron.weekly
,cron.monthly
,cron.d
五个目录和crontab
,cron.deny
二个文件。
其中:
- cron.daily 是每天执行一次的job
- cron.weekly 是每个星期执行一次的job
- cron.monthly 是每月执行一次的job
- cron.hourly 是每个小时执行一次的job
- cron.d 是系统自动定期需要做的任务
- crontab 是设定定时任务执行文件
- cron.deny 文件就是用于控制不让哪些用户使用Crontab的功能
用户配置文件
每个用户都有自己的cron配置文件,通过crontab -e
就可以编辑,一般情况下我们编辑好用户的cron配置文件保存退出后,系统会自动就存放于/var/spool/cron/
目录中,文件以用户名命名。linux的crond服务是每隔一分钟去读取一次/var/spool/cron
,/etc/crontab
,/etc/cron.d
下面所有的内容。
1 | [root@localhost script]# cd /var/spool/cron/ |
crontab命令语法
crontab命令语法如下:1
crontab [ -u user ] file
或1
crontab [ -u user ] { -l | -r | -e }
说明:-u user
是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user
的话,就是表示设定自己的时程表。
另外,使用者也可以将所有的设定先存放在文件中,用 crontab file
的方式来设定执行时间。(此种方法用得少)
参数说明:
- -e : 即edit,执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
- -r : 即remove,删除目前的时程表
- -l : 即list,列出目前的时程表
执行crontab -e
命令后我们就可以编辑定时任务了,时间格式语法如下1
* * * * * commond
具体解释如下1
2
3
4
5
6
7
8* * * * * commond
- - - - - -
| | | | | +------ commond 表示要执行的命令
| | | | +----- 星期中星期几 (0 - 7) (0或7表示星期天)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
特殊字符解释:
- 星号(*):代表每的意思,例如month字段如果是星号,则表示每月都执行该命令操作。
- 逗号(,):表示分隔时段的意思,例如,“1,3,5,7,9”。
- 中杠(-):表示一个时间范围,例如“2-6”表示“2,3,4,5,6”。
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
我们可以通过more /etc/crontab
命令查看帮助信息。
使用示例
我们在/opt/cron_job/script
目录下编辑一个test.sh
,这个脚本的功能就是每隔2分钟向/opt/cron_job/script/addto.txt
文件追加一行文字:test_crontab。脚本内容如下:1
2 !/bin/bash
echo 'test_crontab'>>/opt/cron_job/addto.txt
为了能执行此脚本,需要对脚本增加执行权限1
chmod +x test.sh
可以通过./test.sh
测试脚本是否能正常执行。
执行crontab -e
命令增加定时任务:1
*/2 * * * * /opt/cron_job/script/test.sh
通过tail -f /opt/cron_job/addto.txt
我们就可以看到每隔2分钟就有一行test_crontab加到文件末尾。
其它的一些示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
230 0 * * * sh /root/script/test.sh # 每天夜里0点执行
30 21 * * * systemctl restart httpd # 每晚的21:30重启apache
30 2 1,11,21 * * systemctl restart httpd # 每月1、11、21日的2:30重启apache
45 2 1-10 * * systemctl restart httpd # 每月的1-10日的2:45重启apache
*/2 * * * * systemctl restart httpd # 每隔2分钟重启apache
0 23-7 * * * systemctl restart httpd # 晚上11点到早上7点之间,每隔一小时重启apache
0,30 18-23 * * * systemctl restart httpd # 每天18点至23:00点之间,每隔30分钟重启apache
0 */2 * * * /root/script/test.sh # 两个小时运行一次
0 1 1 * * sh /usr/loacl/bin/cp_banmayun_log.sh >/dev/null 2>&1 # 每月1号的凌晨一点执行计划任务
3,15 * * * * command # 每小时的第3和第15分钟执行
10 1 * * 6,0 /etc/init.d/smb restart # 每周六、周日的1 : 10重启smb
59 11 * * 1-5 /root/script/backup.sh # 每个工作日23:58都进行备份。