cron任务的最后一部分失败,无法解决原因

我在我的服务器上遇到了一个问题,我认为这是cron运行的环境或用户。

我的应用程序设置在一个名为deploy的用户下。 该应用程序的根文件夹是/var/www/apps/akrotoski ,而我需要在这个cron任务中运行的应用程序的可执行文件位于名为bin的子文件夹中,名为thoth

因此,我的cron任务是通过在以deploy用户身份login时键入“crontab -e”创build的:

 # mh dom mon dow command 43 * * * * echo "time = `date`, USER=$USER, current folder = `pwd`, which thoth = `which thoth`" >> ~/import_times.txt; cd /var/www/apps/akrotoski; /var/www/apps/akrotoski/bin/thoth --run_command 'ExternalPost.import' 

目前,它已经设定在每隔一小时43分钟运行一次,所以我可以将它设置为即将发生的时间,然后等待它启动。

第一部分,“回声”只是我试图debugging是怎么回事。 如果我在我的命令行上运行它,它会将以下内容写入~/import_times.txt

time = Tue Nov 1 23:43:52 UTC 2011, USER=deploy, current folder = /var/www/apps/akrotoski, which thoth = /var/www/apps/akrotoski/bin/thoth

然后运行thoth命令(从Web导入一些数据)。

所以,一切似乎都很好 – 它有正确的文件夹,正确的用户,正确的exe。 但是,通过cron任务写入~/import_times.txt的行如下所示:

time = Tue Nov 1 23:43:01 UTC 2011, USER=, current folder = /home/deploy, which thoth =

也就是说,没有用户,这将反过来解释为什么which thoth不会返回任何东西,因为它从部署(或根)用户的PATHvariables中获取位置。 看着我的分贝,我可以看到什么都没有被导入,所以我的“thoth –run_command”调用没有得到正确完成。

如果我使用“crontab -e”创build一个crontab,以部署身份login,是不是在部署下运行? 有人可以直接告诉我可能会出错吗?

谢谢,最大

编辑 – 对于@ott下面,谁build议我输出设置的值 – 这是我从调用集在cron中得到的:

 HOME='/home/deploy' IFS=' ' LOGNAME='deploy' OPTIND='1' PATH='/usr/bin:/bin' PPID='5948' PS1='$ ' PS2='> ' PS4='+ ' PWD='/home/deploy' SHELL='/bin/sh' 

path大大减less了,但是我仍然把完整path传递给我的cron作业中的这个exe文件:

 cd /var/www/apps/akrotoski; /var/www/apps/akrotoski/bin/thoth --run_command 'ExternalPost.import' 

你能看到什么东西从set ,这将需要做这项工作失踪?

编辑 – 我得出了答案感谢@ ott的帮助,在下面的评论中详细说明。 尽pipe如此,为了所有浏览过这个版本的人,问题是环境中的cron已经知道了ruby bin,但是它不知道它必须用ruby打开这个exe文件。 所以我只是在这个exe文件之前添加了“ruby”,把ruby的完整path放在了安全的一边。 我仍然首先在应用程序文件夹cd'ing,再次只是为了安全,所有的完整path可能不是必要的:

 0 * * * * cd /var/www/apps/akrotoski; /usr/local/bin/ruby /var/www/apps/akrotoski/bin/thoth --run_command 'ExternalPost.import' 

修改你的命令来查看这样的环境:

 ( set ; echo "time = `date`, USER=$USER, current folder = `pwd`, which thoth = `which thoth`" ) >> ~/import_times.txt 

你会注意到一个非常简化的环境和PATH。 你可以从HOMEvariables中提取用户名。