欢迎来到李先生的博客

深山的鹿,不知归处;万般皆苦,只可自渡。
扩大
缩小

cron定时任务

一直写定时任务的时候,都是直接用crontab命令,但是对cron定时任务这个东西有时候会混淆,所有就好好总结一下。
 
一、cron
 
crond:计划任务的守护进程
 
1)以前经典的sysvinit方式使用/etc/rc.d/init.d或者/etc/init.d 启动,现在的systemd方式,安装了system服务启动的文件/lib/systemd/system/crond.service,进程启动方式为systemctl start crond.service,启动后会立即返回,因此不需要在启动的时候加&参数
 
2)cron进程会搜索/var/spool/cron目录下以/etc/passwd中的账户名命名的定时任务文件,搜索到定时任务后会加载到内存。cron也会搜索/etc/anacrontab目录与/etc/cron.d目录下定时任务文件。cron会检查所有找到的定时任务并检查每一条定时任务看有没有当前时间执行的。当执行命令时,任何的输出都会以邮件的方式通知crontab的所属者,或者通过crontab的环境变量里的MAILTO指定特定的邮件接收者,执行的定时任务的任何输出也可以发送给系统日志通过-s选项
 
3)一共有两种方式检测到crontabs的变化,第一种方式是检查文件的修改时间modtimes,第二种方式是使用inotify检测。使用inotify的方式的话,在进程启动的时候就开始inotify日志文件/var/log/cron
 
4)当使用第一种方式检查文件的修改时间时,cron会每分钟检查一次modtime,任何的改变都会重新加载。当你改变了定时任务的时候,不需要重启crond。modtime这种方式被用在inotify没有被初始化时。
 
与cron相关的目录和文件:
/etc/crontab:系统定时任务,只能root用户使用,格式与crontab也不一样。
/var/spool/cron 目录 :通过crontab命令添加的定时任务会以添加的账号命名放在此目录下
/etc/cron.d:这个目录里包含不同的用户的定时任务
/etc/cron.deny:禁止使用cron的用户列表文件
/etc/cron.allow:允许使用cron的用户列表文件
/etc/cron.daily:存放每天执行一次的脚本
/etc/cron.hourly:存放每个小时执行一个的脚本
/etc/cron.monthly:存放每个月执行一次的脚本
/etc/cron.weekly:存放每个星期执行一个的脚本
 
 
二、使用crontab
 
crontab是cron的一个工具
 
1、crontab参数的使用
 
crontab -u:指定用户进行操作,如crontab -u lile -e 那么编辑的就是lile用户的crontab文件
crontab -l:输出当前crontab添加的定时任务
crontab -r:删除定时任务(慎用,或者做备份,删除就没了,存放的文件位置为/var/spool/cron目录下,以所属者命名)
crontab -e:编辑,添加定时任务
crontab -i:与-r参数一起使用,crontab -ri 的话会询问是否删除
 
1)root账号通过crontab -e添加一条定时任务
 
 
然后在/var/spool/cron目录下可以看到以root命名的定时任务文件
 
 
2)用户lile通过crontab -l添加一条定时任务
 
 
然后在/var/spool/cron目录下可以看到以lile命名的定时任务文件
 
 
3)/var/log/cron日志:记录cron执行定时任务的日志,哪个时间执行了什么任务
 
 
2、crontab的白名单与黑名单
 
crontab定时任务可以对不同的用户进行设置是否允许使用定时任务。实现方式通过/etc/cron.allow与/etc/cron.deny。如果cron.allow文件存在,那么用户必须存在此文件才能使用crontab;如果cron.allow不存在,cron.deny存在,那么用户必须不存在cron.deny才能执行crontab。如果这两个文件都不存在,那么只有超级用户才能执行crontab。其他更加严格的认证方式可以通过/etc/security/access.conf来限制。
 
1)只有cron.deny时,默认都能使用crontab,只有在cron.deny文件存在的禁止使用
 
把lile用户添加到cron.deny,那么久禁止lile使用crontab了
 
2)当cron.deny与cron.allow都存在时,那么允许使用的用户必须添加在cron.allow里,要不然一样不能使用crontab(除了root)
 
3)当cron.deny与cron.allow都不存在时,那么只有root能使用
 
3、crontab的格式
 
field          allowed values
-----          --------------
minute         0-59
hour           0-23
day of month   1-31
month          1-12 (or names, see below)
day of week    0-7 (0 or 7 is Sunday, or use names)

 

例1:每天的十点五分执行脚本/home/lile/a.sh
 
5 10 * * *  sh /home/lile/a.sh

 

例2:每天的10点到12点的5分,25分,35分打印test
 
5,25,35 10-12 * * * echo "test"

 

三、cron的发送邮件功能
 
crond的sendmail功能:
 
1:安装sendmail
 
yum -y install sendmail sendmail-cf m4 

 

2:测试sendmail,报错
 
 
解决办法:
 
vim /etc/postfix/main.cf
 
inet_interfaces = localhost
改为
inet_interfaces = all

 

3:查看日志,cat /var/log/maillog
 
 
解决办法:
 
vim /etc/hosts,再后面添加主机名
 
127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4 iZj6c5dly2y6k9y0thzjoqZ
::1        localhost localhost.localdomain localhost6 localhost6.localdomain6 iZj6c5dly2y6k9y0thzjoqZ

 

4:测试

 
使用root用户crontab -e添加一条定时任务
 
28 16 * * * echo "test mail"

 

查看日志 cat /var/log/cron,可以看到这个定时任务执行了
 
 
然后查看是否发送了邮件给指定的用户,/var/spool/mail/root,可以看到邮件发过来了
 
 
5:通常会将这个发送邮件功能给关闭,因为当机器的定时任务多的时候会使得/var/spool/mail产生大量的文件,导致磁盘空间不足和inode用完,在添加定时任务的时候,最后每条后面添加一条 >/dev/null 2>&1
 
28 16 * * * echo "test mail" >/dev/null 2>&1

 

或者,在开始的时候添加MAILTO=""
 
MAILTO=""
28 16 * * * echo "test mail"

 

posted on 2018-02-26 23:09  Captain_Li  阅读(8836)  评论(0编辑  收藏  举报

导航