Ruby on Rails - 通过Cron调度的Rake任务无法正常工作

3
当我手动执行rake任务时,它可以正常工作,但是当我将相同的命令放入Cron中时,什么也没有发生:
cd /path/to/my/rails/app && rake daily_import

Cron日志显示命令已被执行。
CMD (cd /path/to/my/rails/app && rake daily_import)

这个rake任务记录错误和成功消息,但是没有任何东西被记录到日志中,什么都没有做。但是如果我使用与Cron运行命令的相同用户复制并粘贴CMD的文本,则一切正常。

我认为在Cron中运行任务应该与自己键入它是一样的,这是正确的吗?

6个回答

8
这个东西对我很有用。
* * * * * /bin/bash -l -c 'cd /path/to/my/rails/app && RAILS_ENV=production bundle exec rake daily_import'

您需要在任务前指定 /bin/bash -l -c。

2

寻找cron守护进程可能发送给正在运行cron作业的用户的邮件。如果cron作业在stderr或stdout上产生输出,则cron守护进程将通过电子邮件将其发送给cron作业的所有者。如果出现问题(可能是由于路径问题,如Rob所建议的那样),您可能会在cron守护程序的电子邮件中看到有用的错误消息。


1
以下解决方案适用于我在Rails 3和rvm集成方面的工作。我只需执行一个bash脚本即可:
0 * * * * rvmuser /bin/bash -l -c '/path/to/my/bashscript > /tmp/script.log'

这似乎需要加上 /bin/bash -l -c 部分才能正常运行。
然后,根据rvm文档,我的bash脚本如下:
#!/usr/bin/env bash

RAILS_ENV=production

source /var/www/rvmuser/.rvm/environments/ruby-1.9.3-p484

cd /path/to/my/rails_app

rake do:whatever

1

如果有人正在使用Rails 3.2<>4.0,请注意,我必须在我的crontab中使用以下内容:

0 * * * * BUNDLE_GEMFILE=/path/to/rails/Gemfile /path/to/bin/bundle exec rake -f /path/to/rails/Rakefile db:hive_enrich RAILS_ENV=production > /var/log/rake_tasks.log 2>&1 &

0

我使用以下格式来运行rake任务,路径更加明确

0 * * * * /usr/bin/rake -f /path/to/Rakefile daily_import RAILS_ENV=production

我也喜欢将输出重定向到文件中,以便检查错误。

0 * * * * /usr/bin/rake -f /path/to/Rakefile daily_import RAILS_ENV=production > ~/daily_import.log 2>&1

0

在运行此 shell 的 cron 用户的 PATH 中是否包含 rake?


你可以尝试在任务中使用完整的 rake 路径(例如,/usr/bin/rake)。另外,你可能需要使用 RAILS_ENV=production 来指定 Rails 的环境。 - elektronaut
它没有被设置,但是在添加后我仍然得到相同的结果。也尝试了electronaut的建议,但结果相同。 - jhamburg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接