crontab 定时任务
-
作用:固定时间同步;数据备份(通常先打包再备份,降低占用磁盘io);日志切割;监控取值;定时执行脚本;辅助程序运行……
-
定时任务配置文件详解
[root@Dezyan ~]# vim /etc/crontab
* * * * * 执行的用户 可执行的文件或命令
- - - - -
| | | | |
| | | | +----- 周 0到7之间的数字,表示星期几(0或7代表星期日)
| | | +-------月 1到12之间的数字,表示月份。
| | +---------日 1到31之间的数字,表示日期。
| +----------- 时 0到23之间的数字,表示小时。
+------------- 分 0到59之间的数字,表示分钟。
----------------------------------------------------------------------
特殊字符* #表示“每”的意思;匹配任何值,例如 */5 表示每5分钟;五颗*表示每分钟都要执行一次定时任务;- #表示区间范围,例如 1-3 表示1点到3点。, #表示间隔,例如 1,3,4-10 表示1点、3点和4点到10点。/ #表示起始时间开始,每隔一定时间执行一次,例如 0/15 表示从0分钟开始,每15分钟执行一次。# */15 表示每过15分钟执行一次L #表示月份或日期的最后一个数字,例如 6L 表示6月的最后一天。W #表示有效工作日(周一到周五),如果与日期一起使用,表示离指定日期最近的一个工作日。# #表示星期中的第几个周,例如 4#3 表示一个月中的第三个星期四。
------------------------------------------------------------------------
在可执行的文件或命令中需要使用\转义的字符空格: (空格需要转义,因为cron会将空格视为参数分隔符)星号:*(星号在cron中用于匹配多个值,如*/5表示每5分钟)问号:?(问号在cron中用于匹配单个字符)井号:#(井号在cron中用于注释)百分号:%(百分号在cron中用于换行)反斜杠:\(反斜杠用于转义其他特殊字符)
- 任务示例
1.使用*/
特殊符号和不使用的区别;
使用:#让系统<每5分钟>执行一次dezyan.sh脚本*/5 * * * * root dezyan.sh#让系统<每分钟>执行一次dezyan.sh脚本* * * * * root dezyan.sh#让系统<每5小时>执行一次dezyan.sh脚本* */5 * * * root dezyan.sh
------------------------------------------------------
不使用:#让系统<每小时的第5分钟>执行一次dezyan.sh脚本05 * * * * root dezyan.sh#让系统<每天凌晨12点>执行一次dezyan.sh脚本00 00 * * * root dezyan.sh
2.使用-,
特殊符号与*.
结合使用和与数字结合使用的区别;
与`*.`结合:#让系统<在7-11点之间的每分钟>都执行一次dezyan.sh脚本* 7-11 * * * root dezyan.sh#让系统<在7-11点之间的每20分钟>都执行一次dezyan.sh脚本*/20 7-11 * * * root dezyan.sh#让系统<在7-11点之间和13-16点之间的每分钟>都执行一次dezyan.sh脚本* 7-11,13-16 * * * root dezyan.sh
----------------------------------------------------------------
与`数字`结合:#让系统<在7-11点之间的每个整点>执行一次dezyan.sh脚本00 7-11 * * * root dezyan.sh#让系统<在7-11点之间和13-16点之间的每个整点>执行一次dezyan.sh脚本00 7-11,13-16 * * * root dezyan.sh
3.一些需要使用\转义符来确保文件语法正确的例子
#每分钟打包/etc/hosts /etc/passwd 名称为 时间+etc.tar.gz 放到/opt目录
* * * * * root tar zcvf /opt/`date +\%F-\%H-\%M`_etc.tar.gz /etc/hosts /etc/passwd
4.需要重新配置PATH变量的任务
#在用户配置文件中每5分钟执行一次时间同步
PATH=/app/tools/cmd:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
* * * * * ntpdate ntp2.aliyun.com &>>/root/cron.log
- 系统和用户定时任务的使用区别
系统 | 用户(以root为例) | |
---|---|---|
文件位置 | /etc/crontab | /var/spool/cron/root |
语法结构 | 执行用户不能省略 | 无需添加执行用户 |
配置方式 | vim /etc/crontab | vim /var/spool/cron/root(无语法检查) crontab -e(有语法检查) |
查看方式 | cat /etc/crontab | cat /var/spool/cron/root crontab -l |
- 定时任务的日志文件
centos和kylin: /var/log/cron
ubuntu: /var/log/syslog
- 一些注意点
1.在书写执行命令时,如果将命令的结果保存到一个不存在的,没有指定位置文件中,系统会默认在家目录中创建;如:*/5 * * * * root echo dezyan >> dezyan.txt会在家目录生成dezyan.txt
2.配置用户定时任务文件时:配置文件放在/var/spool/cron/目录中;当一个用户没有配置定时任务文件时,配置文件时默认没有的;
3.配置用户定时任务文件时:默认识别的PATH变量只有/usr/bin和/bin路径导致某些命令不被识别需要再配置文件开头需要重新配置PATH变量PATH=/app/tools/cmd:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
4.可以自定义是否保留任务结果到文件中(可以排查问题)保留:命令后接 &>>文件 即可不保留:命令后接 &>/dev/null 即可
5.使用centos,如果关闭了邮件服务(systemctl stop postfix)每执行一次定时任务会在`/var/spool/postfix/maildrop/`中自动生成一个小文件,小文件会占用inode号码一定要及时清理,或将定时任务执行的结果定向到文件或者空。
6.避免一些不必要的输出 类似tar -zcf 去掉v 类似打包进入相对路径
7.多条命令使用脚本为佳
- 练习
以每天为时间+ip地址+主机名称在/opt/创建目录 如:mkdir /opt/2024-11-19_oldboyedu_10.0.0.200
打包/etc/passwd /etc/hosts文件名称为etc.tar.gz 放到已经创建好的目录中
查找/opt/目录下所有7天前被修改过的文件删除 (模拟环境使用循环生成需要的文件)
1.编写脚本文件
[root@Dezyan ~/shellScripts]# vim TimeIpHostname.sh
time=`date +%F-%H-%M`
ip=`ip add show ens33 | sed -rn '3s#.*et (.*)/24 .*$#\1#gp'`
hostname=`hostname`
ALL="${time}_${ip}_${hostname}"mkdir -p "/opt/$ALL"
tar zcf "/opt/$ALL/etc.tar.gz" /etc/passwd /etc/hosts
find /opt/* -mtime +7 | xargs rm 2.为脚本添加执行权限
[root@Dezyan ~/shellScripts]# chmod +x /root/shellScripts/TimeIpHostname.sh3.编写/etc/crontab文件
[root@Dezyan ~/shellScripts]# vim /etc/crontab
00 00 * * * root /root/shellScripts/TimeIpHostname.sh