我正在尝试使用crontab执行以下shell脚本:
#!/bin/sh
cd /mnt/voylla-production/current
bundle exec rake maintenance:last_2_days_orders
bundle exec rake maintenance:send_last_2_days_payment_dropouts
crontab条目是
0 16 * * * /mnt/voylla-production/releases/20131031003111/voylla_scripts/cj_4pm.sh
我在邮件中收到以下错误消息:
/mnt/voylla-staging/current/voylla_scripts/cj_4pm.sh: line 3: bundle: command not found
/mnt/voylla-staging/current/voylla_scripts/cj_4pm.sh: line 4: bundle: command not found
手动运行命令时,我没有收到错误。不知道这里发生了什么。请有人指出。
由于
答案 0 :(得分:28)
在crontab中正确设置所有环境的一个好方法是使用/bin/bash -l
:
0 16 * * * /bin/bash -l -c '/mnt/voylla-production/releases/20131031003111/voylla_scripts/cj_4pm.sh'
-l
选项将调用完整的登录shell,从而读取您的bashrc文件及其执行的任何路径/ rvm设置。
如果您想简化您的crontab管理并使用此技巧 - 以及其他人 - 而不必考虑它们,您可以使用Whenever gem。如果你使用capistrano,它也会非常好用,在部署时重新生成crontab。
答案 1 :(得分:7)
cron使用的用户没有正确的环境。 您可以告诉cron使用哪个用户。对于bash脚本,您可以这样:
#!/bin/bash --login
source /home/user/.bashrc
rvm use 2.0.0@gemset #if you use rvm
cd /path/to/project && bundle exec xyz
答案 2 :(得分:0)
我们需要为捆绑包设置正确的路径:
#!/bin/sh
cd /mnt/voylla-production/current
/home/youruser/.rbenv/shims/bundle exec rake maintenance:last_2_days_orders