Linux-定时任务crontab

在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
2
yum -y install vixie-cron
yum -y install crontabs

crond服务的启动与停止

crond服务启动、停止的命令如下:

1
2
3
4
systemctl status crond      # 查看服务状态
systemctl stop crond # 停止服务
systemctl start crond # 启动服务
systemctl reload crond # 重新加载配置

全局配置文件

crontab相关的配置文件是位于/etc目录下面的cron.hourlycron.dailycron.weeklycron.monthlycron.d五个目录和crontabcron.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
2
3
4
5
6
7
8
9
10
11
[root@localhost script]# cd /var/spool/cron/
[root@localhost cron]# ls -lh
total 4.0K
-rw-------. 1 root root 137 May 27 20:15 root
[root@localhost cron]# cat root
*/1 * * * * /opt/cron_job/script/test.sh

0 1 * * * /opt/cron_job/script/mv_logfile.sh

30 0 * * * /opt/cron_job/script/backup_mysql.sh
[root@localhost 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
23
0 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都进行备份。

------ 本文完 ------