从一次Linux计划任务不执行的问题排查过程说起

本文最后更新于2016年7月15日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

=Start=

缘由:

在VPS上有一个扫描的定时任务没有正常运行,所以需要定位一下问题到底出在哪了:cron没有正常运行?还是因为脚本运行时长太长了导致执行不成功?亦或是脚本中某个命令太长导致执行失败?

过程:
查看文档(RTFM)
  • /etc/crontab
  • /var/spool/cron/*
  • /etc/cron.{hourly,daily,weekly,monthly}/
  • /etc/anacrontab
检查日志(RTFL)
  • /var/log/cron*
  • /var/spool/mail/*
检查脚本

1.直接执行

  • 在命令行上直接执行(Tips:需要在多个不同目录中进行测试,防止因为路径问题导致的错误);
  • 通过另外一个脚本调用执行(Tips:有些程序在非终端情况下无法正常执行

2.查看cron中的环境变量

  • 在自己写的脚本中手动设定环境变量PATH(也可以通过source命令载入其它脚本用来设置环境变量);
  • 先分析一下现有cron中的环境变量「* * * * * env > /tmp/env.output」;

3.查看邮件

正常情况下,crontab执行失败,在没有屏蔽错误的情况下会产生一封系统邮件,位于 /var/spool/mail/root ,可以通过查看邮件内容来分析错误原因。

原因总结:
  1. crontab服务未正常运行(查看 /var/log/cron 或 /var/log/messages 日志);
  2. 脚本权限问题(ls -l查看脚本的属主以及可执行位是否已设置);
  3. 环境变量问题(手动设置PATH);
  4. 路径问题(所有需要用到路径的地方都使用绝对路径);

另,在最初以为是cron本身不支持「长时间任务」或「命令过长」导致定时任务无法正常执行,但是后来通过阅读crontab源码发现并没有这些限制,所以以后如果碰到cron任务有问题了,老老实实按照上面的几个原因进行分析,肯定可以解决问题的。

参考链接:

=END=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/2703.html

《从一次Linux计划任务不执行的问题排查过程说起》上有6条评论

  1. 最近在Linux系统上用Cron定时执行一些任务时总是失败,查看日志发现原来是crond不知什么时候挂了,重启多次也没用。。。查看「/var/log/cron」日志发现内容为空,重启crond也不起作用,无奈,现在只能用另一个daemon进程(Supervisord)去监控crond的状态了
    http://supervisord.org/installing.html
    http://ju.outofmemory.cn/entry/201847
    http://www.ziqiangxuetang.com/django/django-nginx-deploy.html
    http://blog.wiseturtles.com/posts/centos-supervisor.html
    http://wiki.hustlzp.com/post/linux/centos-7-python

    sudo pip install supervisor
    sudo echo_supervisord_conf > /etc/supervisord.conf
    sudo mkdir -p /etc/supervisord.d/
    # [include]
    # files = /etc/supervisord.d/*.conf
    sudo supervisord -c /etc/supervisord.conf


    # vim /etc/supervisord.d/crond.conf
    [program:start_crond]
    command=/etc/init.d/crond start
    startsecs=0
    stopwaitsecs=0
    autorestart=true
    user=root


    supervisorctl status
    supervisorctl help
    supervisorctl start start_crond

  2. 【应急响应】定时任务知识梳理
    http://vinc.top/2017/07/19/%E3%80%90%E5%BA%94%E6%80%A5%E5%93%8D%E5%BA%94%E3%80%91%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E7%9F%A5%E8%AF%86%E6%A2%B3%E7%90%86/

    应急响应中关于定时任务应该排查的文件有:
    /etc/crontab,/etc/cron.d,/var/spool/cron/{user},/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly,/etc/anacrontab

    其中比较容易忽视的是 /etc/anacrontab

    如何查看和CentOS下定时任务cron有关的文件列表?
    # rpm -qa | grep "cron"
    # rpm -ql crontabs
    # rpm -ql cronie
    # rpm -ql cronie-anacron

  3. crontab为何自动中断
    https://mp.weixin.qq.com/s/KdgIYX4zb_xoYNVIugBLvg

    由于在部分机器上,crontab对于执行程序的输出有大小限制,输出超出一定的字节之后就会自动停止程序。

    而我的程序每发送1000条数据即会输出一条log,所以每次正好输出49000这条log之后,就超出了大小限制,因此每次都会自动停止在48999条了。

    解决方案:可以 重定向输出至 >/dev/null,如:
    1 8 * * * cd /path/to/your/bin/ && ./your_bin --flagfile=../conf/your.flags >/dev/null 2>&1 &

    希望遇到类似问题的同学,可以尽快的搜索到我这篇文章。

发表评论

电子邮件地址不会被公开。 必填项已用*标注