Rails Capistrano - 每当 Cron 为每个部署附加 cron 作业时

Rails Capistrano - Whenever Cron appends cron jobs for every Deployment

我正在使用:

Ruby     1.9.3
whenever 0.9.4
Rails    3.2
and capistrano/whenever extension.

每当部署发生时,它都会在每次部署后向 crontab 文件添加条目。由于 5 次部署,crontab -l 中有 40 个条目,因为 schedule.rb 有 8 个 cron 条目。每个版本都有不同的条目。它不应该默认覆盖条目吗?

它会在 schedule.rb 文件中每次提到时重新创建条目。

我发现每当向 crontab 文件中添加一个 cron 作业时,每个 cron 作业都由包含 capistrano 发布目录路径的注释行分隔...像这样:

# Begin Whenever generated tasks for: /home/path/www/to/releases/2070527160502/config/schedule.rb

(您可以使用 crontab -e 查看原始 crontab 文件,看看其中放了什么)

下一次部署发生时,无论何时查看是否有以注释分隔的 cron 作业,但使用 new 版本号。它没有找到,所以它将新作业附加到 crontab 文件。

我解决此问题的方法是在 deploy.rb 中指定 update_crontab 任务,并指定 schedule.rb 的显式路径,如下所示:

namespace :deploy do
  task :update_crontab do
    on roles(:all) do
      within current_path do
        execute :bundle, :exec, :whenever, "--update-crontab", "~/path/to/current/config/schedule.rb"
      end
    end
  end
end
after 'deploy:symlink:release', 'deploy:update_crontab'

因此 crontab 文件中的注释分隔符包含 'current' 路径而不是 'releases/nnnnnnnnnnn' 路径。

我怀疑这应该不是必需的,但在尝试解决问题一段时间后,这就是我最终得到的结果。

检查您是否正在设置

set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:stage)}" }

如果您不这样做,它将选择默认标识符,这是您的 config/schedule.rb 文件的扩展路径。

https://github.com/javan/whenever/blob/6e69dd8a6b3e2a8f4b2911b4efa5aab65cdc9dcb/lib/whenever/command_line.rb#L51

File.expand_path(@options[:file])