对一次 crontab 执行失败的调试

问题:

任务目标是每隔一段时间将某 mongo 数据库内的某段信息,导入到 mysql 数据库,系统为 CentOS 6.5.
主体脚本采用 php 编写,但为了调用方便,并和其他脚本接合使用,又做了一个 bash 脚本封装了该 php 脚本.
然后由 crontab 执行该 bash 脚本,完成排期任务.
编写完成后,却发现 php 的日志文件始终没有记录到运行信息.

解决:

查看 /var/log/cron ,确认 crontab 配置已生效,bash 脚本已被调用.
单独运行 bash 脚本,可正常工作.
单独运行 php 脚本,可正常工作,并且日志打印罗辑也没有错误.
在 bash 脚本中加入日志打印,发现在被 crontab 执行时, bash 罗辑正常,唯独 php 脚本没有任何执行痕迹.

最后决定认真看下 crontab 机制,发现:
crontab 有自己的 PATH 机制,和用户环境的 PATH 不是一回事.
crontab 的 PATH 要在 /etc/crontab 这个文件中去编辑,默认没有 /usr/local/bin 这个路径.
而所用服务器的 php 是编译安装的,安装完成后手动将 php 解释器 ln -s 到 /usr/local/bin 下了,却没有放在 /usr/bin 目录下.
所以手动执行 bash 脚本和 php 脚本都可以成功,但被 crontab 执行就不成功,因为解释器没有找到...

知道原因,解决办法就简单了.
或者将解释器路径软链到 crontab 可识别的路径内;
或者编辑 /etc/crontab 将 /usr/local/bin 加入 PATH 内;
或者在 bash 脚本内执行 php 脚本时,用 php 解释器的全路径去执行.

我采用了第三个,因为这样减少了该 bash 脚本对于环境的依赖性,便于移植.

程序员开发节奏快,任务急,很多问题大家都是用到哪学到哪,不求甚解.
到后来会发现,越来越多的问题都是基础不扎实导致的.还是基础最重要啊.

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容