问题:
任务目标是每隔一段时间将某 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 脚本对于环境的依赖性,便于移植.