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,

这样日志输出问题就解决了。

猜你喜欢

转载自www.cnblogs.com/LiuChang-blog/p/12313500.html