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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章