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

orangeleopard 发布于4年前

=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任务有问题了,老老实实按照上面的几个原因进行分析,肯定可以解决问题的。

参考链接: