Linux_Cronjob
12/22/2015 8:57:35 PM
[toc]
before cronjob
任务计划、周期性任务
未来的某事情执行、一次性任务:at、batch
周期性执行任务:crontab
执行结果会通过邮件发送给用户
netstat -ntlp
本地电子邮件服务
smtp:simple mail transmission protocol
pop3:Post Office Protocol
imap4:Internet Mail Access Protocol
mail(mailx)
mailx:send and receive Internet mail
mail [-s 'SUBJECT'] username[@hostname]
邮件正文的生成:
- 交互式输入;.单独成行可以表示正文结束,或者Ctrl+d提交
- 通过输入重定向
- 通过管道
mail
直接收取邮件
\#:查看第#份邮件
q:退出邮件查看
计划任务
at命令
at [OPTION]... TIME
TIME:
HH:MM:[YYYY-mm-dd]
noon,midnight,teatime
tomorrow
now+#
Units:minutes,hours,days,OR weeks
Ctrl+d提交任务
-l:
<==> atq
-f /PATH/TO/JOBSCRIPT:
通过文件提交作业
-d #:删除指定作业,atrm #
-c #:查看指定作业的具体内容,#为job编号
-q QUEEN:指明队列,,b,c,d等
[root@localhost ~]# at -q b now+2hours
at> cat /etc/issue
at> rm -rf /tmp/*<EOT>
job 1 at 2015-12-11 07:47
You have mail in /var/spool/mail/root
[root@localhost ~]# atq
1 2015-12-11 07:47 b root
[root@localhost ~]# at -l
1 2015-12-11 07:47 b root
提交后的作业格式为:(如:job 1 at 2015-12-11 07:47)
作业序号 作业提交时间 作业队列 作业用户
作业队列:默认都使用a队列
注意:
at -c命令会显示出了命令本身以外这个命令运行的用户环境,比如环境变量等,如果用户没有登陆就使用默认环境
作业的执行结果会通过邮件发送给提交作业的用户
batch命令
batch命令和at命令类似,只不过batch命令会让系统自动选择在系统资源较空闲的时间去执行指定的任务
cronjob
服务程序cronie
cronie是cronjob的主程序包,提供了crond守护进程及相关辅助工具
deamon crond
\#确保crond守护进程deamon处于运行状态
\# CentOS6
[root@localhost ~]# rpm -qa cronie
cronie-1.4.4-15.el6.x86_64
[root@localhost ~]# service crond status
crond (pid 2228) is running...
\# CentOS7
[root@localhost ~]# systemctl status crond.service
向crond提交作业的方式不同于at,它需要使用专门的配置文件,此文件有固定格式,不建议使用文本编辑器直接编辑此文件;要使用crontab命令
每提交一个cronjob,就会在相应的/etc/cron.*/目录下添加任务,这个任务不是在其中的文件中可以查看的
分类
系统cronjob
主要用于实现系统自身的维护,只能手动编辑这类任务:[root@localhost ~]# vim /etc/crontab
- 每一行定义一个周期性任务,一共7个字段
* * * * *:定义周期性时间
username:运行任务的用户身份
command to be executed:任务
- 此处的环境变量不同于用户登陆后获得的环境,因此,命令使用绝对路径,或者自定义PATH环境变量
- 执行结果邮件发送给MAILTO指定的用户
用户cronjob
用户cron的配置格式:/etc/spool/cron/USERNAME
在用户没有使用crontab的时候,上述文件是不存在的,只有设定了计划任务才有上述文件
crontab命令
crontab [-u user] [-l | -e][-i][-s]
-e:编辑任务
-l:列出所有任务
-r:移除所有任务;即删除/var/spool/cron/USERNAME
删除单个任务使用-e去编辑
-i:在使用-r选项移除所有任务时提示
-u:root用户可为指定用户管理cron任务
注意:运行结果以邮件通知给当前用户,如果把结果给/dev/null,如果出现问题管理员难以发现
注意:定义COMMAND时,如果命令中存在%符号,需要对其转义;或者使用单引号''括起来。
计划时间
- 特定值
给定时间点有效取值范围内的值:
注意:day of week和day of month一般不同时使用 - *
给定时间点上有效取值范围内的所有值,比如minute字段为*表示0-59 - 离散时间
在时间点上使用逗号分隔的多个值
#,#,# - 连续时间
在时间点上使用-连接开头和结束
#-# - 在指定时间点上,定义步长./
/#:#就是步长
**注意:指定的时间不能被步长整除时,其意义将不复存在,最小时间单位是分钟,完成秒级任务,需要额外机制,比如shell中的循环,即定义成每分钟任务:再利用脚本实现在每分钟之内,循环执行多次
例子
- 3 * * * *:每小时执行一次,每小时的第三分钟
- 3 4 * * 5:每周执一次,周五的四点三分执行
- 5 6 7 * *:每月执行一次,每月7号的6点5分执行
- 7 8 9 10 *:每年执行一次,每年的10月九号8点7分
- 9 8 * * 3,7:每周三和周日的8点9分
- 0 8,20 * * 3,7:每周三和周日的8点和12点执行一次
- 0 9-18 * * 1-5:周一到周五的白天的9:00,10:00,…18:00执行一次
- /5 * * *:每5分钟执行一次某任务
- /7 * * *:没有意义
- 某任务在指定的时间因关机未能执行,下次开机会不会自动执行?
绝对不会执行!
如果期望时间因故未能按时执行,下次开机后无论是否到了相应时间点都要执行一次,可使用anacron实现; - 每12小时备份一次/etc目录至/backups目录中,保存文件名称格式为”etc-yyyy-mm-dd-hh.tar.xz”
0 */12 * * * root /bin/tar -PJcf /backups/etc-`date +%F-%H` /etc
几点注意:/bin/tar要使用绝对路径+tar命令的-P选项+命令引用
12. 每周2、4、7备份/var/log/secure文件至/log目录中,文件名格式为”secure-yyyymmdd”
0 0 * * 2,4,7 root /bin/tar -PJcf /log/secure-`date +%Y%m%d`.tar.xz /var/log/secure
- 每两小时取出当前系统/proc/meminfo文件中以S或M开头行信息追加至/tmp/meminfo.txt文件中
0 */2 * * * root /bin/grep '^[MmsS].*' /proc/meminfo >> /tmp/meminfo.txt
注意:每一个cronjob在配置之前,都要亲自试验一边,否则,如果出错了,自己还以为是对的,这样会造成严重的后果
anacron
crontab可以指定计划任务,但是如果服务器在指定时间宕机或者没有启动,那么这个cronjob还会执行以前时间的计划吗?答案是**NO,crontab会以新一轮的时间开始执行**.这也就是为什么会有anacron。
anacron并不能取代cron去运行某项任务,而是以天为单位或者是在启动后立刻进行anacron的动作,它会去侦测停机期间应该进行但是并没有进行的crontab任务,并将该任务运行一遍后,anacron就会自动停止了。
因此,anacron也是通过crontab来执行工作的,它只是为crontab提供了保障。
## /etc/anacrontab - configuration file for anacron
这个文件在安装系统是就存在默认的配置。
其中字段有两种形式:
period delay job-identifier command
@period_name delay job-identify command
图片中第一行解释为:每天开机5分钟后就检查cron.daily文件是否被执行了,如果今天没有被执行就执行他它
图片中第二行解释为:每隔7天开机后25分钟检查cron.weekly文件是否被执行了,如果一周内没有被执行就执行它
图片中第二行解释为:每隔一个月天开机后45分钟检查cron.monthly文件是否被执行了,如果一个月内没有执行就执行它