背景: 前段时间由于有些人员离职,导致监控邮件发送报错,监控邮件一直没有发出来,过了好久才知道,于是做了一个队tomcat异常日志的监控,有错误就发邮件(用python写的)
写好之后,于是用Linux自带的crontab定时器来做。
0 20 10 * * * python /home/pentaho/sendmail.py >/dev/null 2>&1
最开始时这样写的,但是发现怎样都没有调用成功,于是做了几个猜想:
1,crontab 调用python的方式错了
2,python 执行错了
3,crontab 配置错了
后面发现是 crontab的格式错了,应该是,只有五个位置,而六个位置是cron表达式
20 10 * * * python /home/pentaho/sendmail.py >/dev/null 2>&1
于是在网上整理了关于crontab的资料
CRONTAB概念/介绍
crontab命令用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。
cron 系统调度进程。 可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月中的不同时段运行。cron是系统主要的调度进程,
可以在无需人工干预的情况下运行作业。crontab命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab文件来保存调度信息。
系统管理员可以通过cron.deny 和 cron.allow 这两个文件来禁止或允许用户拥有自己的crontab文件。
对于crontab来说,Linux系统中每个用户都有自己的crontab,如果你是新增crontab定时器,千万不要执行crontab -r,这个会删除掉原来的定时器
触发方式:
crontab由于是系统自带的,所以当增加或者修改后,不要重启服务,系统会每隔一分钟扫描这个文件。
系统的cron文件在 /etc/crontab
用户的cron文件在/var/spool/cron/crontab下
[root@Q302-OSSTJ11 ~]# cd /var/spool/cron
[root@Q302-OSSTJ11 cron]# ll |grep crontab
[root@Q302-OSSTJ11 cron]# ll
总计 8
-rw------- 1 pentaho root 1 12-08 14:43 pentaho
-rw------- 1 root root 350 12-09 10:51 root
[root@Q302-OSSTJ11 cron]# cat root
0 5 * * * /home/crond/logwatch.pl >/dev/null 2>&1
0 5 * * * /home/crond/logrotate >/dev/null 2>&1
0 5 * * * /home/crond/prelink > /dev/null 2>&1
0 */1 * * * /home/crond/ntp.sh >/dev/null 2>&1
0 5 * * * /home/crond/rpm >/dev/null 2>&1
0 5 * * * /home/crond/tmpwatch >/dev/null 2>&1
0 10 * * * python /home/pentaho/sendmail.py >/dev/null 2>&1
[root@Q302-OSSTJ11 cron]#
Crontab语法
usage: crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
(default operation is replace, per 1003.2)
-e (edit user's crontab)
-l (list user's crontab)
-r (delete user's crontab)
-i (prompt before deleting user's crontab)
-s (selinux context)
Crontab 格式
使用crontab -e 添加要执行的命令。
添加的命令必须以如下格式:
* * * * * /command path
前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,即命令字段,其中包括了crontab调度执行的命令。 各个字段之间用spaces和tabs分割。
前5个字段分别表示:
分钟:0-59
小时:1-23
日期:1-31
月份:1-12
星期:0-6(0表示周日)
一些特殊符号:
*: 表示任何时刻
,: 表示分割
-:表示一个段,如第二端里: 1-5,就表示1到5点
/n : 表示每个n的单位执行一次,如第二段里,*/1, 就表示每隔1个小时执行一次命令。也可以写成1-23/1.
一些示例:
00 8,12,16 * * * /data/app/scripts/monitor/df.sh
30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_ind_unusable.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_maxfilesize.sh
10 8,12,16 * * * /data/app/scripts/monitor/check_objectsize.sh
43 21 * * * 21:43 执行
15 05 * * * 05:15 执行
0 17 * * * 17:00 执行
0 17 * * 1 每周一的 17:00 执行
0,10 17 * * 0,2,3 每周日,周二,周三的 17:00和 17:10 执行
0-10 17 1 * * 毎月1日从 17:00到7:10 毎隔1分钟 执行
0 0 1,15 * 1 毎月1日和 15日和 一日的 0:00 执行
42 4 1 * * 毎月1日的 4:42分 执行
0 21 * * 1-6 周一到周六 21:00 执行
0,10,20,30,40,50 * * * * 每隔10分 执行
*/10 * * * * 每隔10分 执行
* 1 * * * 从1:0到1:59 每隔1分钟 执行
0 1 * * * 1:00 执行
0 */1 * * * 毎时0分 每隔1小时 执行
0 * * * * 毎时0分 每隔1小时 执行
2 8-20/3 * * * 8:02,11:02,14:02,17:02,20:02 执行
30 5 1,15 * * 1日 和 15日的 5:30 执行