1. 定时任务服务名称
crond
默认开机自动运行 自动启动 默认有系统的定时任务
2. 定时任务的相关文件
两个
用户的定时任务文件
/var/spool/cron/用户名 # 普通用户定义定时任务的配置文件
管理员的定时任务文件
/etc/crontab
3. 定时任务书写方式
格式 使用的/etc/crontab 管理员定时任务
* * * * *
分 时 日 月 周
第一颗星: 表示分钟 0-59 0表示整点
第二颗星: 表示小时 0-23 0表示凌晨12点
第三颗星: 表示天 1-31
第四颗星: 表示月 1-12
第五课星: 星期几 0-6 0表示周日 7表示周日
* 表示每分钟
*/n
*/5 * * * * cmd
- 区间
上午的5点到11点执行 cmd命令
00 5-11 * * * cmd
,分隔
上午的5点到11点 下午的15点执行cmd命令
00 5-11,15 * * * cmd
案例:
每天早上8点整来学校上车
如何表示8点
0 8 * * * root echo "sc" ## 00 08 * * * root echo "sc"
调试定时任务
* * * * * 每分钟执行1次
如何查看定时任务是否执行成功
俩文件:
[root@oldboyedu ~]# tailf /var/log/cron # 只是查看有没有运行 但里面的定时任务有没有成功 不显示
[root@oldboyedu ~]# cat /var/spool/mail/root # 开启了邮件服务 可以查看定时任务有没有成功 postfix 默认开启
每天晚上11点30分 回家开车
30 23 * * * root echo "kc"
4. 使用用户定时任务
两种:
直接修改配置文件
vim /var/spool/cron/root
使用命令编辑配置文件
crontab -e 编辑文件 ---> vim /var/spool/cron/root # 语法检查 书写是否正确
crontab -e ===== vim /var/spool/cron/root(当前登录系统的用户名)
crontab -l 查看用户的定时任务
crontab -r 删除用户定时任务 危险!
每间隔5分钟进行一次时间同步命令 ? 在加定时任务的时候 在12点03的时候加上的 下次的执行时间是?
*/n
*/5 * * * * root ntpdate ntp1.aliyun.com
5. 定时任务规范
5.1 定时任务规则之前加注释
# Author oldboy date 11.10 备份 QQ110
* * * * * sh /server/scripts/tar.sh
5.2 使用脚本替代命令行定时任务
1) 在命令行测试
2) 写入脚本测试 使用-x 查看脚本的执行过程
[root@oldboyedu scripts]# sh -x tar.sh
++ ifconfig eth0
++ awk 'NR==2{print $2}'
+ IP=10.0.0.200
++ date +%F-%H-%M-%S
+ TIME=2020-11-12-11-26-18
+ mkdir -p /root/10.0.0.200
+ cd /etc
+ tar zcf /root/10.0.0.200/2020-11-12-11-26-18_etc.tar.gz hosts passwd
-------------
[root@oldboyedu ~]# cat /server/scripts/tar.sh
###1. 获取IP地址 定义变量
IP=`ifconfig eth0|awk 'NR==2{print $2}'`
TIME=`date +%F-%H-%M-%S`
###2. 创建以IP命名的目录
[ -d /root/$IP ] || mkdir /root/$IP # 判断目录是否存在 如果成功 执行&& 后面的内容 如果失败执行||
###3. 打包文件并放入目录
cd /etc
tar zcf /root/$IP/${TIME}_etc.tar.gz hosts passwd
---------------
[root@oldboyedu ~]# [ -d /etc ] && echo "目录存在" || echo "目录不存在"
目录存在
[root@oldboyedu ~]# [ -d /etccccc ] && echo "目录存在" || echo "目录不存在"
目录不存在
5.3 定时任务中date命令%百分号
默认crontab不识别% 特殊含义的字符 需要转义\
* * * * * tar zcf /opt/`date +\%F`_etc.tar.gz /etc/hosts &>/tmp/error.log
* * * * * date +\%F &>/tmp/test.log
第二种方式 写入脚本
[root@oldboyedu scripts]# cat test.sh
tar zcf /opt/`date +%F`_etc.tar.gz /etc/hosts &>/tmp/error.log
5.4 运行脚本一定要用/bin/sh或sh
1.如果定义了环境变量PATH 不需要加/bin /usr/bin
2.如果没有定义 建议全路径执行
5.5 定时任务中-命令或脚本结果(正确及错误)定向到黑洞(>/dev/null 2>&1)或追加到文件中 >>/tmp/oldboy.txt 2>&1
每执行一个定时任务 每次都会把执行结果发送到邮件系统中 /var/spool/mail/root # 前提是postfix开启状态
公司中大量的服务器是关闭postfix服务 邮件无法接收到定时任务的结果. 憋着发布出去 会产生大量小文件
大量的小文件会占用大量的inode 导致无法往磁盘中写入数据
解决方法1:
执行结果 定向到黑洞或者定向到文件中
解决方法2:
开启邮件系统 不建议
解决方法3:
定时删除小文件
默认小文件的位置:
/var/spool/postfix/maildrop/
测试生成小文件
systemctl stop postfix # 关闭邮件服务
定义多个定时任务 生成小文件
5.6 避免不必要的程序及命令输出
打包进入相对路径 /etc/hosts cd /etc
tar zcvf 去掉 v
5.7 打包压缩使用相对路径(切到目标目录的上一级打包目标)
5.8 定时任务脚本中的程序文件 ,尽量用绝对路径
前提是没有定义PATH变量
5.9 系统与命令位置有关的环境变量问题
PATH="echo $PATH:/usr/local/maven/bin"
/usr/local/maven/bin: