我有一台运行Ubuntu 12.04的服务器,我们用它来托管Rails应用程序。我在cron上运行一个任务,它由几个由&&
分隔的unix命令组成 - 例如:
cd /home/deploy/app/current && RAILS_ENV=production ...
最后一位已被剪断,因为命令在第一个cd
上失败,其中包含:
cd:没有这样的文件或目录
在 deploy 用户的环境中,cd可以正常运行。该目录存在,它是一个符号链接:
lrwxrwxrwx 1 deploy deploy 42 Mar 4 15:28 /home/deploy/app/current -> /home/deploy/app/releases/20130304152305
我觉得奇怪的是,shell转换为符号链接的能力会受到环境的影响,因此我将cron的环境变量吐出到文件中,根据这个问题:How to simulate the environment cron executes a script with?。
如果我尝试将该行作为cron用户执行,则会失败:
$ env - $(cat ~/cron.env) cd /home/deploy/app/current
env: cd: No such file or directory
为什么会这样? cron的环境变量是:
HOME=/home/deploy
LOGNAME=deploy
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/home/deploy
答案 0 :(得分:1)
cd
是内置的shell,而不是程序,因此cron
和env
都不能直接执行它。以下内容适用于您的cron工作:
sh -c "cd /home/deploy/app/current && RAILS_ENV=production ..."