问题现象

新换了个VPS装了个程序,需要用到系统定时任务,可装完发现程序功能异常。一开始怀疑程序的问题,毕竟自己凭着三脚猫功夫改过些代码。

折腾完发现程序代码没问题,原来是定时任务没执行。但查看系统任务在正常地跑着,任务配置格式也没问题,手动执行是正常的。搜了下issues,该问题有不少人遇到,但都没有明确给出问题的根本原因。

问题原因

不喜欢兜圈子,直接说原因:
www 用户一般在安装LNMP或者宝塔面板时会自动创建,且是个无登录权限无 HOME 的用户,如果系统定时任务归属于此用户,估计系统任务执行时需要到对应用户目录下执行,此时 crond 执行时会出现切换目录失败,导致表面上没错,但定时任务未执行。

1
(CRON) ERROR chdir failed (/home/www): No such file or directory

错误日志

1
tail -f /var/log/cron

开着这个,会监控到 crond 服务执行日志,有错误也能看到,照错误提示去解决就行了。
正常执行情况下是这样子的:

1
2
Mar 15 20:14:01 xxx CROND[23817]: (www) CMD (php /yyy/artisan schedule:run >> /dev/null 2>&1)
Mar 15 20:15:01 xxx CROND[23844]: (www) CMD (php /yyy/artisan schedule:run >> /dev/null 2>&1)

问题排查方法

检查任务设置

确认自己的定时任务设置没问题,包括语法结构和用户权限等,命令可以手动执行测试下,任务设置方法可见:

  1. SSRpanel搭建相关设置问题:定时任务
  2. Linux系统的添加任务计划参考

倒推检查

  1. 检查任务执行后的结果是否符合预期
  2. 确保定时任务服务启动状态:service crond status
  3. tail -f /var/log/cron 查看系统定时任务执行情况
  4. 根据日志解决对应错误问题
  5. 系统任务无错的情况检查自己的任务执行命令,手动执行看结果