涞水吧,一方嘉通,龙霸环宇
文中部分内容摘自骏马金龙的博客,查看可
cron的守护进程(daemon)
centos7可以使用以下方式查看,centos6可以使用:service crond status 看到enable和running即可 [root@centos7 ~]# systemctl status crond.service ● crond.service - command scheduler loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) active: active (running) since wed 2018-09-05 15:14:24 cst; 1h 9min ago main pid: 1437 (crond) cgroup: /system.slice/crond.service └─1437 /usr/sbin/crond -n sep 05 15:14:24 centos7.4 systemd[1]: started command scheduler. sep 05 15:14:24 centos7.4 systemd[1]: starting command scheduler... sep 05 15:14:24 centos7.4 crond[1437]: (cron) info (random_delay will be scaled with factor 80% if used.) sep 05 15:14:25 centos7.4 crond[1437]: (cron) info (running with inotify support)
运行进程与设置开机自启
centos7 [root@centos7 ~]# systemctl start crond.service [root@centos7 ~]# systemctl enable crond.service centos6 [root@centos7 ~]# service crond start [root@centos7 ~]# chkconfig --livel 3 crond on
crondtab file为任务定义文件
[root@centos7 ~]# cat /etc/crontab shell=/bin/bash path=/sbin:/bin:/usr/sbin:/usr/bin ##cron任务只能识别这几个路径下的命令,如果命令不在这几个目录中,就会找不到命令,所以建议使用全路径 mailto=root # for details see man 4 crontabs # example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) or jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (sunday=0 or 7) or sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
这个文件中包含如下信息:
1. shell:周期执行任务用的shell 2. path:命令路径 3. mailto:执行结果发送给哪个用户 4. * * * * * 分别表示:分、时、日、月、周 5. username:执行命令的用户(用户cron任务没有) 6. command to be executed:周期执行的任务/命令,在默认情况下命令会根据/etc/crontab中指定的path路径进行查找,所以建议使用全路径
(1)特定值: 给定时间点有效取值范围内的值; note:day of week 和 day of month一般不同时使用 note:如果定义的日和周冲突了,则会多次执行(不包括因为*号导致的冲突)。例如每月的15号执行该任务,同时又定义了周三执行该任务,正常无冲突情况下,将在周三和每月15号执行,但如果某月的15号同时是周三,则该任务在此日执行两次。因此,应该尽力避免同时定义周和日的任务 (2) * 给定时间点上有效取值范围内的所有值;表示每...(每分钟0-59、每小时0-24、每天1-29/30/31、每月1-12、每周0-6) (3)离散取值:, 在时间点上使用逗号分隔的多个值 #,#,# (4)连续取值:- 在时间点上使用“ - ”连接开头和结束 #-# (5)在指定时间点上,定义步长 /#:#即步长 note: (1)指定的时间点不能被步长整除时,其意义将不复存在 (2)最小时间单位为“分钟”,想完成“秒”级人物,需要额外借助于其他机制 定义成每分钟任务:再利用脚本实现在每分钟内,循环多次 另外一个需要注意的时间段设置是,使用*号导致低级别的时间覆盖高级别的时间。例如"* */2 * * *",它不表示每两小时执行一次任务,而是每分钟执行一次,尽管在小时位上设置了每隔两小时,但在分钟位上设置的是每分钟,所以它仍然表示每分钟执行一次任务。同理,"*/5 */2 * * *"分钟位上的设置覆盖小时位上的设置,表示每5分钟执行一次而忽略小时位的设置;"00 */2 */5 * *"表示每隔两小时的整点执行一次任务而忽略天数位的设置
实例
3 * * * * 每小时的第3分钟执行一次 3 4 * * * 每周五的04:03执行一次 5 6 7 * * 每月7号的06:05执行一次 7 8 9 10 * 每年10月9日的08:07执行一次 9 8 * * 3,7 每周三和周日的08:09执行一次 00 8,20 * * 3,7 每周三和周日的8:00和20:00执行一次 0 9-18 * * 1-5 工作日的工作时间 */2 * * * * 每2分钟执行一次 */7 * * * * 每7分钟执行一次(60除7除不开,所以最后一次是间隔4分钟就执行了,然后下面一小时重新执行) */30 * * * * 每半小时执行一次 00 */2 * * * 没两个小时的整点执行一次
name
crontab - maintains crontab files for individual users
synopsis
crontab [-u user] file crontab [-u user] [-l | -r | -e] [-i] [-s] crontab -n [ hostname ] crontab -c
options
-e 编辑任务 -l 列出当前用户的crontab任务都有什么 -r 移除所有任务,即删除/var/spool/cron/username文件(推荐使用#进行注释,或者直接删除相应条目) -i 在使用-r选项移除所有任务时提示用户确认 -u 指定编辑哪个用户的crontab
note:运行结果以邮件通知给当前用户;如果拒绝接受邮件可以:
1. command > /dev/null ##将正确的执行结果发送给null
2. command &> /dev/null ##将正确与错误的执行结果发送给null
note:定义command时,如果命令需要用到%,需要对其转义;因为直接使用%表示换行的特殊意义,且第一个%后的所有字符串将当作命令的标准输入。
思考:某任务在指定的时间因关机未能执行,下次开机会不会自动执行?
不会执行,只能等待下一个时间节点
如果期望某时间因故未能按时执行,下次开机后无论是否到了响应时间点都要执行一次,可使用anacron实现
examples
1、每12小时备份一次/etc目录至/backup目录中,保存文件 名称格式为“etc-yyyy-mm-dd-hh-mm-ss.tar.gz” 00 */12 * * * /bin/tar -zcf /backup/etc-$(date "+\%f-\%h-\%m-\%s").tar.gz /etc 2、每周2、4、7备份/var/log/secure文件至/logs目录中,文件名格式为“secure-yyyymmdd.tar.gz”; * * * * 2,4,7 /bin/tar -zcf /log/secure-$(date +\%f).tar.gz /var/log/secure 3、每年9月份的10号到24号这段时间,每2小时取出当前系统/proc/meminfo文件中以s或m开头的行信息,追加至/tmp/meminfo.txt文件中 00 */2 9-24 10 * /bin/egrep "^(s|m)" /proc/meminfo >> /tmp/meminfo.txt 2>/dev/null
1、查看crontab的日志文件/var/log/cron
[allen@centos7 ~]$ sudo tail -f /var/log/cron sep 6 09:14:01 centos7 crond[24490]: (root) cmd (/bin/tar -zcf /backup/etc-"$(date "+%f-%h-%m-%s")".tar.gz /etc &> /dev/null) sep 6 09:15:01 centos7 crond[24510]: (root) cmd (/bin/tar -zcf /backup/etc-"$(date "+%f-%h-%m-%s")".tar.gz /etc &> /dev/null) sep 6 09:15:01 centos7 crond[24511]: (allen) cmd (/usr/sbin/ntpdate -u ntp.aliyun.com >/dev/null 2>&1) sep 6 09:16:01 centos7 crond[24535]: (root) cmd (/bin/tar -zcf /backup/etc-"$(date "+%f-%h-%m-%s")".tar.gz /etc &> /dev/null) sep 6 09:17:01 centos7 crond[24552]: (root) cmd (/bin/tar -zcf /backup/etc-"$(date "+%f-%h-%m-%s")".tar.gz /etc &> /dev/null) sep 6 09:18:01 centos7 crond[24569]: (root) cmd (/bin/tar -zcf /backup/etc-"$(date "+%f-%h-%m-%s")".tar.gz /etc &> /dev/null) sep 6 09:19:01 centos7 crond[24586]: (root) cmd (/bin/tar -zcf /backup/etc-"$(date "+%f-%h-%m-%s")".tar.gz /etc &> /dev/null) sep 6 09:20:01 centos7 crond[24605]: (root) cmd (/bin/tar -zcf /backup/etc-"$(date "+%f-%h-%m-%s")".tar.gz /etc &> /dev/null) sep 6 09:20:01 centos7 crond[24606]: (allen) cmd (/usr/sbin/ntpdate -u ntp.aliyun.com >/dev/null 2>&1) sep 6 09:21:01 centos7 crond[24670]: (root) cmd (/bin/tar -zcf /backup/etc-"$(date "+%f-%h-%m-%s")".tar.gz /etc &> /dev/null)
2、使用crond命令的调试
参考
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
网友评论