尝试解决之:首先是怀疑crontab的服务没有启动,因为没有root权限,不能用命令看crontab状态,问同事,同事说crontab是默认启动的,然后我ps -ef|grep cron一把,发现cron是在跑的。这就不懂了,因为程序里面是有写log的,但是log文件可以看出来程序一直没跑。再问同事,然后他加了一条cmd在crontab里面:echo "1" 1>/home/temp.log,过了一会这个log文件就有内容了,可以看出来cron服务是正常运行的。这就怪了,我的程序是一个很简单的程序啊,怎么就跑不起来。当时同事说一般这种问题都是环境变量引起的。我的程序是使用了mysql库,
到这个时候,
百思不得其解,然后突然想到看别人的crontab配置里面有这样一句:2>&1,意思就是说标准错误信息和标准输出一样可以被重定向到一个文件,也许这个可以让我看看有没有出错信息呢。加上,马上发现程序运行时提示找不到mysql库,这下我终于想到是环境变量的问题了。由于我没有root权限,不能直接在/etc/crontab里面加上环境变量。所以就要写一个运行脚本,在脚本里面export LD_LIBRARY_PATH=/data/lib,然后在脚本里面调用程序。cron配置的时候就运行这个脚本就可以了。
修改完,过一会居然还有错,提示找不到程序文件。嗯,我在脚本里面调用程序用的是"./"这个相对路径来调用程序,但是crontab里面用的是用绝对路径来找运行脚本,比如:/home/auto_run.sh,这样就导致找不到程序文件了。修改成:cd /home;./auto_run.sh,有cd /home这句命令后,就可以改变当前目录,然后可以找到程序文件了。这下终于可以了。
回想这个问题,还真是绕了不少弯啊,主要是没有利用1>/home/temp.log 2>&1这种来查看输出。因为cron是一个守护进程,它设计成为捕捉所有的stdout和stderr然后mail给用户(这个没看cron的源代码,估计也是这样),所以在crontab里面只配置echo是不行的,必须把stdout重定向到文件,这样就可以了。
没有评论:
发表评论