16、系统的定时任务
16.1、安装crontab:
yum install crontabs -y
service crond start/restart/status
:普通的用户具有root的权限可以执行crontab,受普通用户的限制;
16.2、crontab的用户调度方式:
16.2.1、用户任务调度:
用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。
用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录中。
其文件名与用户名一致,使用者权限文件如下:
/etc/cron.deny 该文件中所列用户不允许使用crontab命令
/etc/cron.allow 该文件中所列用户允许使用crontab命令
/var/spool/cron/ 所有用户crontab文件存放的目录
root通过/var/adm/cron/cron.allow文件来控制谁有权使用crontab命令(root有一切的权利)。 cron.allow文件不存在,cron.deny文件为空文件,所有的用户都可以使用crontab(默认),
deny文件不存在用户的名字出现在cron.allow文件中,他就有权使用crontab命令。 如果两个文件都不存在,只有root可以提交任务(优化)。
16.2.2、系统任务调度(不常用):系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
/etc/crontab文件包括下面几行:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,
第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
16.3、脚本规范:
执行 shell 脚本前加 /bin/sh;
定时任务命令或脚本结尾加 > /dev/null 2>&1(防止向postfix(服务关闭的情况下,如果没有关闭则会自动清理日志)发送日志,容易导致inode填满):
> 代表重定向到哪里,例如:echo "123" > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
生产任务程序不要随意打印输出信息 tar zcvf echo 123 > a.log或 ***** /etc/bin echo "$(date)" >>/time.log;
16.4、crontab命令详解:
-l:显示当前已存在的定时任务
-e:编辑定时任务,退出后内容自动生效,默认生成当前用户的定时任务,在/var/spool/cron中,以用户名开头,(属于用户调度)
新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行
千万不要乱运行crontab -r。它从 crontab 目录(/var/spool/cron)中删除用户的 crontab 文件。删除了该文件,那么该用户的所有 crontab 都被删除了
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户则默认删除当前用户的
16.5、定时任务执行的脚本要规范路径(/server/scripts):
[root@centos6 cron.hourly]# cd /service/scripts/
[root@centos6 scripts]# touch text.cron
[root@centos6 scripts]# vi text.cron
/bin/echo "$(date)" >>/time.log
[root@centos6 scripts]# crontab -e
* * * * * /service/scripts/text.cron >/dev/null 2>&1
tailf /var/log/cron 查看正在运行的定时任务(只限root用户)
16.6、crontab的文件格式:
* * * * * 【command】 -----> 分 时 日 月 周 【要执行的命令】
最好周用 6,7
16.7、定时任务调试的方法:
增加执行任务频率调试任务
每分钟或者系统时间之后5分钟执行,看结果对不对
某些任务不能用于生产环境没有测试的机会
代码,配置变更发布流程
个人开发环境,办公测试环境,idc机房测试环境,idc正式环境
调整系统时间调试任务,最少保持5分钟
16.8、crontab总结:
16.8.1、问题1:这样的任务都无法执行:
*/10 * * * * /usr/local/bin/python /tmp/test_all.py &> /tmp/result/$(date +"%m%d-%H%M").txt
*/10 * * * * /usr/local/bin/python /tmp/test_all.py &> /tmp/result/`date +"%m%d-%H%M"`.txt
解决方法:%前面需要加 \,即:
*/10 * * * * /usr/local/bin/python /tmp/test_all.py &> /tmp/result/$(date +"\%m\%d-\%H\%M").txt
*/10 * * * * /usr/local/bin/python /tmp/test_all.py &> /tmp/result/`date +"\%m\%d-\%H\%M"`.txt
16.8.2、问题2:修改系统时间后任务不执行:
解决方法:重启crond服务
16.8.3、问题3:环境变量,crontab本身缺少环境变量:
解决方法:脚本中使用souce或expect激活环境变量
16.8.4、问题4:路径问题,脚本或计划任务中携带相对路径:
解决方法:将脚本和计划任务中携带相对路径改成绝对路径
16.8.5、问题5:脚本本身没有执行性权限:
解决方法:chmod +x 赋予脚本执行权限。
16.8.6、清理系统用户的邮件日志并忽略日志输出:
场景说明:每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,
将每条任 务进行重定向处理非常重要。 例如,可以在crontab文件中设置如下形式,忽略日志输出:
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,
这样日志输出问题就解决了。