作用:
crond 是linux用来定期执行程序的命令。安装完成操作系统后,默认启动此任务调度命令
crond命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作
linux系统定时任务调度工作主要分为两类:
系统执行的工作 -- 系统周期性执行的任务,如轮询系统日志,备份系统数据,清理系统缓存等
[root@root ~]#ll /var/log/messages*
-rw------- 1 root root 149 Feb 21 15:11 /var/log/messages
-rw-------. 1 root root 941651 Jan 31 16:33 /var/log/messages-20210131
-rw------- 1 root root 578536 Feb 14 13:32 /var/log/messages-20210214
-rw------- 1 root root 434135 Feb 21 14:04 /var/log/messages-20210221
用户执行的工作 -- 用户定期要做的工作,如每隔5分钟和互联网上时间服务器进行时间同步,每隔10分钟检查邮件服务器是否有新信。这些工作由用户自行设置
相同软件种类:
- cronie 实现定时任务功能
- atd 实现定时任务功能 只能一次设置定时功能
- anacron 实现定时任务功能 常应用在家用电脑 非7*24服务器
Linux crond定时任务软件包
#使用yum provides crond or yum provides crondtab 查看定时任务命令属于哪个软件工具包
[root@root ~]#yum provides crontab
#如果没有搜索到工具包名 使用 */crontab or *bin/crontab
[root@root ~]#yum provides */crontab
#还是没有搜索成功 建议优化yum源并扩展yum源
#根据搜索的包名 检查是否安装cronie软件
[root@root ~]# rpm -qa cronie
cronie-1.4.4-16.el6_8.2.i686
#查看软件包中的所有文件信息
[root@root ~]# rpm -ql cronie
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/crontab
/usr/lib/systemd/system/crond.service
/usr/sbin/crond
/usr/share/doc/cronie-1.4.11
/usr/share/doc/cronie-1.4.11/AUTHORS
/usr/share/doc/cronie-1.4.11/COPYING
/usr/share/doc/cronie-1.4.11/ChangeLog
/usr/share/doc/cronie-1.4.11/INSTALL
/usr/share/doc/cronie-1.4.11/README
/usr/share/man/man1/crontab.1.gz
/usr/share/man/man5/crontab.5.gz
/usr/share/man/man8/cron.8.gz
/usr/share/man/man8/crond.8.gz
/var/spool/cron
常用相关配置文件介绍(有的目录属于系统有的目录属于cronie软件包中):
/var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务配置文件,每个配置文件以创建用户名字命令
/etc/crontab 这个文件负责调度各种管理和维护任务
/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本
/etc/cron.deny crontab限制用户权限,不可以使用crontab的用户写入其中。未写入的用户可以使用crontab
/etc/cron.allow crontab限制用户权限,可以使用crontab的用户写入其中。未写入的用户不可以使用crontab
ps: cron.deny和cron.allow 都存在时 忽略cron.deny的内容 cron.allow文件权限大于cron.deny
系统定时任务周期:每小时 控制定时任务目录:/etc/cron.hourly
系统定时任务周期:每一天 控制定时任务目录:/etc/cron.daily 00:00-23:59
系统定时任务周期:每一周 控制定时任务目录:/etc/cron.weekly 7天
系统定时任务周期:每个月 控制定时任务目录:/etc/cron.monthly 30 28 31
定时任务crond支持两种实现方式:
1. 直接编写计划任务
2. 使用目录的方式,放在指定的目录都会定时执行
crontab命令及参数:
crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
常用参数:
-l 查看crontab文件内容
-e 编辑crontab文件内容
-r 移出所有crontab文件内容(如果只删除某个,用-e编辑即可)
-i 配合-r参数使用,在移出所有crontab文件内前提示是否删除
提示:
1. crontab{-l | -e}实际上就是在操作/var/spool/cron/当前用户这样的文件
2. 在crontab命令中只有"绝对路径",不存在相对路径,执行任何命令都需要写绝对路径 (which 命令 -- 查看命令绝对路径)
定时任务直接编辑
crontab -e
#执行命令后直接进入vi编辑界面 每一行都是单独一项工作
编写语法规范:
[root@root ~]#cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# 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
crontab基本格式
* * * * * cmd
分 时 日 月 周 需要执行的命令
代表意义 | 分钟 | 小时 | 日期 | 月份 | 周 | 命令 |
数字范围 | 0~59 | 0~23 | 1~31 | 1~12 | 0~7 | 需要执行的命令 |
周 -- 0或7都代表"星期天"的意思。
特殊字符 | 代表含义 |
* | 星号代表任何时刻,就是“每”的意识。取值范围所有数字 举例: 00 01 * * * cmd 表示每天的01点执行命令 |
, | 逗号代表分割时段。 举例: 30 09,10 * * * cmd 表示每天的9点30分和10点分执行命令 |
- | 减号代表一个时间范围段。 举例: 20 09-12 * * * cmd 表示每天的9点到12点的20分(9点20|10点20|11点20|12点20)执行命令 |
/n | n代表数字范围内的数字,即每隔n单位间隔的意识,例如每隔15分钟:*/15 * * * * cmd 举例: 15 */3 * * * cmd 表示每隔3小时的15分钟执行命令 |
实践应用:
#查看crond是否开启及开机自启动
#centos6
[root@root ~]#service crond status
crond (pid 1038) is running...
[root@centos6-003 ~]#chkconfig --list
abrt-ccpp 0:off 1:off 2:off 3:on 4:off 5:on 6:off
abrtd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
#centos7
systemctl status crond
#查看定时任务
[root@centos6-003 ~]#crontab -l
#每两分钟执行一次echo命令
*/2 * * * * echo "crontad定时任务执行"
#通过日志或邮件信息查看定时任务是否执行
[root@root ~]#tail -5 /var/log/cron
Feb 21 19:42:01 centos6-003 CROND[2162]: (root) CMD (echo "crontad\345\256\232\346\227\266\344\273\273\345\212\241\346\211\247\350\241\214")
Feb 21 19:44:01 centos6-003 CROND[2169]: (root) CMD (echo "crontad\345\256\232\346\227\266\344\273\273\345\212\241\346\211\247\350\241\214")
Feb 21 19:46:01 centos6-003 CROND[2176]: (root) CMD (echo "crontad\345\256\232\346\227\266\344\273\273\345\212\241\346\211\247\350\241\214")
Feb 21 19:48:01 centos6-003 CROND[2183]: (root) CMD (echo "crontad\345\256\232\346\227\266\344\273\273\345\212\241\346\211\247\350\241\214")
Feb 21 19:50:01 centos6-003 CROND[2191]: (root) CMD (echo "crontad\345\256\232\346\227\266\344\273\273\345\212\241\346\211\247\350\241\214")
[root@root ~]#tail -10 /var/spool/mail/root
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20210221115201.D5AADC1467@root.localdomain>
Date: Sun, 21 Feb 2021 19:52:01 +0800 (HKT)
crontad定时任务执行
#crontad定时任务正常执行后创建一个脚本再进行测试
[root@root ~]#cat /tmp/crondTest.sh
#!/bin/bash
touch crondTest_`date +%F-%H-%M`.txt
#编写定时任务
[root@root ~]#crontab -e
#查看编写的定时任务
[root@root ~]#crontab -l
#每两分钟执行一次echo命令
*/2 * * * * echo "crontad定时任务执行"
#每隔一分钟执行crondTest.sh
*/3 * * * * /bin/sh /tmp/crondTest.sh
#通过日志和邮件查看是否执行
*/3 * * * * echo "crontad定时任务执行"
定时任务排查方法:
#检查定时任务配置文件是否存在
[root@root ~]#cat /var/spool/cron/root
#每两分钟执行一次echo命令
*/2 * * * * echo "crontad定时任务执行"
#每隔一分钟执行crondTest.sh
*/3 * * * * /bin/sh /tmp/crondTest.sh
#查看定时任务日志文件
[root@root ~]#tail -3 /var/log/cron
Feb 21 20:18:01 root CROND[2409]: (root) CMD (echo "crontad\345\256\232\346\227\266\344\273\273\345\212\241\346\211\247\350\241\214")
Feb 21 20:20:02 root CROND[2420]: (root) CMD (echo "crontad\345\256\232\346\227\266\344\273\273\345\212\241\346\211\247\350\241\214")
Feb 21 20:21:01 root CROND[2427]: (root) CMD (/bin/sh /tmp/crondTest.sh)
执行时间 主机名 定时任务执行PID 用户名 执行命令
#打印信息到屏幕上的定时任务可以查看邮件
[root@root ~]#tail -5 /var/spool/mail/root
Message-Id: <20210221122801.BBF4BC1467@root.localdomain>
Date: Sun, 21 Feb 2021 20:28:01 +0800 (HKT)
crontad定时任务执行
编写定时任务的注意事项:
1) 编写定时任务要有注释说明
2) 定时任务命令或程序写到脚本里执行
3) 命令和文件使用绝对路径
4) 编写定时任务,结尾加 > /dev/null 2>&1 可以将输出到屏幕上的信息保存到黑洞中,避免占用磁盘空间
5) 指定用户下执行相关定时任务
6) 生产任务程序尽量不要产生屏幕输出信息
注: 定时任务中执行命令,如果产生输出到屏幕的信息,都会以邮件方式告知用户
/var/spool/mail/root 不断变大占用磁盘空间 占用的block空间
解决方法: 将邮件服务关闭
centos6: service postfix stop
centos7: systemctl stop postfix
/var/spool/postfix/maildrop/ 不断产生小文件占用磁盘空间 占用的inode空间
解决方法: 删除小文件
rm -f /var/spool/postfix/maildrop/*
systemctl start postfix