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相关的目录和文件:

二、使用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执行定时任务的日志,哪个时间执行了什么任务

  1. 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能使用

  1. crontab的格式

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

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

三. 具体定时功能使用

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:

  1. 每一个域可出现的字符如下:

  1. 每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:

  1. 举几个例子:

四、cron的发送邮件功能

crond的sendmail功能:

  1. 安装sendmail

  1. 测试sendmail,报错

解决办法:

3.查看日志,cat /var/log/maillog

解决办法:

  1. 测试

使用root用户crontab -e添加一条定时任务

查看日志 cat /var/log/cron,可以看到这个定时任务执行了

然后查看是否发送了邮件给指定的用户,/var/spool/mail/root,可以看到邮件发过来了

  1. 问题处理
    通常会将这个发送邮件功能给关闭,因为当机器的定时任务多的时候会使得/var/spool/mail产生大量的文件,导致磁盘空间不足和inode用完,在添加定时任务的时候,最后每条后面添加一条 >/dev/null 2>&1

    或者,在开始的时候添加MAILTO=""

参考链接1:https://www.cnblogs.com/lemon-le/p/8476626.html
参考链接2:https://blog.csdn.net/aa15237104245/article/details/93748631

赞赏

微信赞赏支付宝赞赏

发表评论

邮箱地址不会被公开。 必填项已用*标注