Linux的计划任务 |
linux定时任务的分类(本文主要讲解crontab):
batch与at相同,不过它是在系统负载小于0.8的时候执行调度。
定时任务的作用: 例如,自动在线更新 自动日志分析(日志占用inode而且影响读写性能) 某些后台工作定时执行 定时删除临时文件 需要防范的地方: 1、***程序可能使用工作调度来搜集系统信息 2、很多***是以例行工作被植入的,可以检查/var/log/cron看是否非你设置的cron被执行了 3、部分离职员工会利用计划去做破坏 |
crond的日志文件/var/spool/cron cron的每一项工作都会记录到/var/log/cron这个日志文件中 cron会每分钟都去读取一次/etc/crontab与/var/spool/cron里面的数据 PATH定义变量的执行路径 |
1、 配置文件 vim /etc/crontab SHELL=/bin/bash //使用的shell PATH=/sbin:/bin:/usr/sbin:/usr/bin //执行文件查找命令 MAILTO=root //额外输出,以email将数据发送给谁
2、 计划任务存放位置 /var/spool/cron 3、日志文件 查看计划任务是否执行 /var/log/cron 4、以下目录内可以存放脚本 该脚本就会按照时间去执行 /etc/cron.hourly/ 每小时 /etc/cron.weekly/ 每周日 /etc/cron.daily/ 每天 /etc/cron.monthly/ 每月1号 5、权限管理 /etc/cron.deny 黑名单 在此文件中写入的用户不可以使用crond /etc/cron.allow 白名单 只有在此文件中写入的用户可以使用crond |
注意事项
[root@ansible-db log]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin(请注意:crontab的PATH变量与系统的PATH变量不同,可能会导致部分命令无法使用,crontab执行shell时只能识别为数不多的系统环境变量,解决办法就是要执行的语句都放在脚本中,同时在脚本中声明变量) 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 [root@ansible-db log]# echo $PATH /usr/local/redis/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin |
crontab标准化工作流程 1、计划任务脚本指定存放位置,便于维护和定期备份 /etc/crontab 2、写定时任务前必须在前面写注释,包括以下: 添加计划任务的人,添加任务的时间,任务有效期,计划任务脚本的对象,脚本的作用,以及其他需要提醒其他注意的事项 3、执行的脚本前加上/bin/bash或者/bin/sh,脚本必须使用完整的绝对路径 4、定时任务,需要尽量避免标准输出和标准错误输出 结尾加上 >/dev/null 2>&1. 计划任务的标准输出和标准错误输出都会给root用户以邮件(在配置文件中定义的),很容易撑满磁盘消耗磁盘inode 5、能用命令完成的也要写在脚本里 6、在指定用户下执行相关的定时任务 7、制定标准的书写规范 其他使用注意: 环境变量问题:计划文物的脚本得环境变量需要在脚本重新定义,可以手动在脚本内加载环境变量的配置文件如 8、定时任务的权限检查(chmod u+x /tmp/b.sh,尽量在脚本前面带上/bin/sh命名,否则有可能因为忘了为脚本设定执行权限) 9、定时任务脚本的检查(sh –x 调试,bash –n检查语法,在各个细小环境减少出错的机会。) 10、先在测试环境中演练 |
example: 1、报错如下, /bin/sh: /tmp/20190428.sh: Permission denied 检查脚本权限问题
2、每一分钟执行一次脚本 */1 * * * * sh /tmp/20190428.sh 3、只保留最近1个月的日志文件 crontab -e 1 * * * * find /var/log -mtime +30 |xarge -i rm -rf {} 或者 -exec rm -rf {} \; 4、jim用户每天在家目录创建一个以日期命名的目录20170412 crontab -u jim -e 1 0 * * * /bin/mkdir /home/jim/`date +%Y%m%d` 5、>/dev/null 2>&1的作用 如果定时任务规范结尾不加 >/dev/null 2>&1,很容易导致硬盘inode空间被占满,从而系统服务不正常 (var/spool/clientmqueue邮件临时队列目录,垃圾文件存放于此,如果是centos 6.4系统,默认不装sendmail服务,所以不会有这个目录。) 工作调度出错后会一直发邮件给MAILTO设置的邮箱,可以使用重定向输出到黑洞 |
1 * * * *是每个整点过一分钟执行