Cron 工作在每当 gem 中不起作用

Posted

技术标签:

【中文标题】Cron 工作在每当 gem 中不起作用【英文标题】:Cron job not working in Whenever gem 【发布时间】:2011-11-24 19:28:51 【问题描述】:

我有一个包含一堆任务的应用程序,每天我都想运行一个 cron 作业,为数据库中的每个任务创建一个 DayTask。任务 has_many DayTasks 和这些 daytasks 是用户每天要检查的内容。我正在使用when gem,但它似乎根本没有运行。有什么想法吗?

config/schedule.rb

every 1.day, :at => "12:01am" do
  runner "Task.generate_tasks_for_day"  
end

任务.rb

  def generate_tasks_for_day
    Task.all.each do |task|
      task.day_tasks.create(:target_date => Date.today)
    end 
  end 

运行'whenever命令'的结果

1 0 * * * /bin/bash -l -c 'cd /home/grant/rails_projects/GoalTwist && script/rails runner -e production '\''Task.generate_tasks_for_day'\'''

注意:每次我想测试运行时,我都会更改 config/schedule.rb 中的时间。

【问题讨论】:

我可以检查一下,当您说“运行'whenever 命令'的结果”时,您是否也检查过这是在crontab -l 中?另外,这是在什么操作系统上?我通常会在 UTC 中运行我的服务器,并确保无论何时使用您的本地时区将这些时间转换为 UTC 时间。 # Begin 每当生成任务时:daytask 42 18 * * * /bin/bash -l -c 'cd /home/grant/rails_projects/GoalTwist && script/rails runner -e production '\' 'Task.generate_tasks_for_day'\''' # End 每当为:daytask 生成任务时,我正在运行 Linux Mint。感谢您对时区差异的提醒。 【参考方案1】:

我终于解决了如何在任何时候运行 gem。 它在生产中运行良好,但在开发模式下却不行(我认为要在开发模式下运行良好,您必须做一些技巧)。

然后,这些是要做的过程:

    安装 gem 写你的scheduler.rb文件 推送到远程服务器 登录远程服务器(例如使用ssh) 通过在终端中运行查看何时上传好:whenever 每当 crontab 运行时更新:whenever --update-crontab 重启服务器crontab(例如在Ubuntu服务器中):sudo service cron restart 检查 crontab 是否在服务器上实现良好:crontab -l

就是这样!

就个人而言,我更喜欢直接从服务器设置我的 crons:

    编辑 crontab:crontab -e 附加我的 cron(例如,每天早上 5:00 - 对于不基于 Linux 的服务器可能略有不同):0 5 * * * /bin/bash -l -c 'cd /path_to_my_app/current && RAILS_ENV=production bundle exec rake my_cron_rake' 检查是否实施良好:crontab -l 完成

【讨论】:

谢谢!一开始我不太明白它是如何工作的。我期待更多的魔法;) 我不明白为什么 sidekiq 或任何时候都没有提到 whenever --update-crontab 我在 prod 服务器上运行时显示“找不到命令”,尽管已部署 cron 作业crontab -l 我猜你的问题@Cyzanfar 与这个问题没有严格的关系。无论如何,我猜您忘记导入或错误安装了whenever 二进制文件 - 请检查which whenever 的结果。你在另一个用户上运行它吗?这个用户有正确的权利吗?如果问题仍然存在,建议您搜索类似问题或打开一个新问题。 这更像是对我自己的评论,因为我每隔几个月就会来到这里,但希望它也能对其他人有所帮助:每当 --update-crontab 在 AWS 盒子上捆绑 exec 【参考方案2】:

您必须通过运行以下命令在 crontab 中实际注册作业:

whenever --update-crontab

此外,如果您要让作业在本地运行,请添加 :environment => "development"你的任务

runner "MyTask.some_action", :environment => "development"

【讨论】:

【参考方案3】:

尝试直接从终端执行任何时候生成的命令或添加以下行 MAILTO=your@emailadress.com 到你的 crontab。

【讨论】:

我将该行添加到我的 crontab...没有电子邮件。 从 Rails 控制台调用方法时是否正在生成日常任务?如果是,您是否尝试登录生产服务器并执行/bin/bash -l -c 'cd /home/grant/rails_projects/GoalTwist && script/rails runner -e production '\''Task.generate_tasks_for_day'\'''【参考方案4】:

如果whenever 命令给你-bash: whenever: command not found,试试bundle exec whenever

【讨论】:

以上是关于Cron 工作在每当 gem 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

具有 kerberos 安全性的 Sqoop 在 cron 中不起作用,抛出 GSSException

@reboot 在 CRON 中不起作用

Ubuntu:Mpsyt 在 cron 中不起作用

Geocoder Gem 在生产环境中不起作用

Linux:gsutil 在 cron 中不起作用

:footnotes 扩展在 Redcarpet Ruby gem 中不起作用