我的服务器上的 cron 出现了问题,我认为这是由于 cron 运行的环境或用户造成的。
我的应用程序是在名为 的用户下设置的deploy
。应用程序的根文件夹是/var/www/apps/akrotoski
,而我需要在此 cron 任务中运行的应用程序的可执行文件位于名为 的子文件夹bin
中thoth
。
因此,我的 cron 任务是在以用户身份登录时通过输入“crontab -e”创建的deploy
:
# m h 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 分钟后运行,所以我可以将其设置为即将发生的时间,然后等待它启动。
第一部分,使用“echo”只是我试图调试发生了什么。如果我在命令行上运行它,它会将以下内容写入~/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 命令(从网络导入一些数据)。
所以,一切似乎都很好 - 它有正确的文件夹、正确的用户、正确的 exe。但是,~/import_times.txt
cron 任务写入的行如下所示:
time = Tue Nov 1 23:43:01 UTC 2011, USER=, current folder = /home/deploy, which thoth =
即没有用户,这反过来解释了为什么which thoth
它没有返回任何内容,因为它从部署(或 root)用户的 PATH 变量中获取了位置。查看我的数据库,我可以看到没有导入任何内容,所以我的“thoth --run_command”调用没有正确完成。
如果我使用“crontab -e”创建 crontab,并以 deploy 身份登录,那么它不是在 deploy 下运行吗?有人能告诉我可能出了什么问题吗?
谢谢,马克斯
编辑-对于下面的@ott,他建议我输出set的值-这是我在cron中调用set得到的:
HOME='/home/deploy'
IFS='
'
LOGNAME='deploy'
OPTIND='1'
PATH='/usr/bin:/bin'
PPID='5948'
PS1='$ '
PS2='> '
PS4='+ '
PWD='/home/deploy'
SHELL='/bin/sh'
路径大大减少,但无论如何,我确实在我的 cron 作业中将完整路径传递给了 thoth exe:
cd /var/www/apps/akrotoski; /var/www/apps/akrotoski/bin/thoth --run_command 'ExternalPost.import'
您认为set
完成这项工作还缺少什么吗?
编辑 - 我在 @ott 的帮助下找到了答案,详情见下面的评论。不过,它在评论下方,所以为了其他浏览过此内容的人的利益,问题在于 cron 运行的环境知道 ruby bin,但它不知道必须用 ruby 打开 thoth exe。所以我只需要在 thoth exe 之前添加“ruby”,并附上 ruby bin 的完整路径,以防万一。我仍然先 cd 到 app 文件夹,同样只是为了安全起见,有了所有完整路径,可能就没有必要了:
0 * * * * cd /var/www/apps/akrotoski; /usr/local/bin/ruby /var/www/apps/akrotoski/bin/thoth --run_command 'ExternalPost.import'
答案1
修改命令以查看如下环境:
( set ; echo "time = `date`, USER=$USER, current folder = `pwd`, which thoth = `which thoth`" ) >> ~/import_times.txt
您会注意到环境和 PATH 非常简化。您可以从 HOME 变量中提取用户名。