我刚刚在一个典型的'nix服务器上继承了Rails项目.决定将它移动到客户端的heroku,由我来完成后台进程.目前,它使用Whenever来安排每日事件(电子邮件等)并在启动时启动延迟的作业队列.
Heroku提供了一个使用发条的自定义时钟进程文档的示例,我可以通过这个示例随时使用吗?我可能遇到的任何陷阱?我是否需要创建一个单独的工作人员dyno?
我在rails应用程序中随时使用并使用capistrano进行部署.
麻烦的是,因为我只将它用于一个项目没有问题,但是当我在同一服务器上使用更多项目时,每次部署我的项目时,我都会销毁并重新创建cron文件.我需要每个项目都更新它或附加新指令,以便在同一台服务器上共存.
我只是部署
deploy.rb
set :whenever_command, "bundle exec whenever"
require "whenever/capistrano"
...
after "deploy:create_symlink", "deploy:update_crontab"
....
Run Code Online (Sandbox Code Playgroud)
有人可以教我怎么办?
deployment capistrano ruby-on-rails whenever whenever-capistrano
无论什么时候我都在使用gem,而且我无法让我的跑步者指令正常工作.
我收到这个错误:
/Users/bl0b/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.11/lib/rails/commands/runner.rb:53:in `eval': undefined method `run' for #<Class:0x007f97d88744a8> (NoMethodError)
from (eval):1:in `<top (required)>'
from /Users/bl0b/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.11/lib/rails/commands/runner.rb:53:in `eval'
from /Users/bl0b/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.11/lib/rails/commands/runner.rb:53:in `<top (required)>'
from /Users/bl0b/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.11/lib/rails/commands.rb:64:in `require'
from /Users/bl0b/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.11/lib/rails/commands.rb:64:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
Run Code Online (Sandbox Code Playgroud)
我的代码中包含以下代码shedule.rb
:
set :environment, 'development'
every 1.minutes do
runner "Crawler.run", :output => '/Users/bl0b/Projects/crawler/cron.log'
end
Run Code Online (Sandbox Code Playgroud)
在我的app/models/crawler.rb
我有以下代码:
class Crawler < ActiveRecord::Base
def run
puts "toto"
end
end
Run Code Online (Sandbox Code Playgroud) 我参考https://github.com/javan/whenever,按照所有步骤进行操作
在schedule.rb中
require 'yaml'
set :environment, 'production'
set :output, {
:error => "/log/error.log",
:standard => "/log/cron.log"
}
every 1.minute do
runner "User.weekly_update"
end
Run Code Online (Sandbox Code Playgroud)
在gemfile中
gem 'whenever', :require => false
Run Code Online (Sandbox Code Playgroud)
输出一些命令
localhost:〜/ project $ when -i
[write] crontab file updated
Run Code Online (Sandbox Code Playgroud)
localhost:〜/ project $ crontab -l
# Begin Whenever generated tasks for: /home/bacancy/project/config/schedule.rb
* * * * * /bin/bash -l -c 'cd /home/bacancy/project && script/rails runner -e production '\''User.weekly_update'\'' >> /log/cron.log 2>> /log/error.log'
# End Whenever generated tasks for: /home/bacancy/project/config/schedule.rb …
Run Code Online (Sandbox Code Playgroud) 我有一个名为'reports'的自定义环境,它设置为命中从属数据库.我正在尝试使用Whenever gem 配置一些cron作业,并希望在部署之前在开发中测试它们.有没有办法在开发中测试cron作业?无论如何我可以在本地安排它们然后启动我的报告服务器,看看它们是否运行?谢谢!
我使用Rails 4,sidekiq 2.13.1,每当cron脚本每2分钟运行一次.在第一次执行期间没有错误但是所有下一次都会出错.我只在生产环境中遇到此错误.我的工作人员位于app/workers中.我通过在application.rb中跟随字符串来包含它:
config.eager_load_paths += %W(#{config.root}/app/workers)
Run Code Online (Sandbox Code Playgroud)
错误:
2013-08-15T12:34:05Z 31102 TID-oh1d0 WARN: {"retry"=>true, "queue"=>"default", "class"=>"AllGlobalWorker", "args"=>[], "jid"=>"c8f5827813277c890b4a621e", "enqueued_at"=>1376570045.3903732}
2013-08-15T12:34:05Z 31102 TID-oh1d0 WARN: uninitialized constant AllGlobalWorker
2013-08-15T12:34:05Z 31102 TID-oh1d0 /home/shared/bundle/ruby/2.0.0/gems/activesupport-4.0.0/lib/active_support/inflector/methods.rb:226:in `const_get'
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?谢谢.
我们在我们的项目中使用带轨道的宝石。我了解我们可以使用每当gem这样的时间来调度命令。
every 1.day, :at => '6:00 am' do
command "echo 'hello'"
end
Run Code Online (Sandbox Code Playgroud)
但是我的问题是我只想在满足某些条件时才执行此命令。这样的事情。
every 1.day, :at => '6:00 am' do
if User.any_new_user?
command "echo 'hello'"
end
end
Run Code Online (Sandbox Code Playgroud)
我们如何通过everyth和rails实现这一目标?我能想到的一种可能的解决方案是,我为此创建一个跑步者并检查那里的状况。
every 1.day, :at => '6:00 am' do
runner "User.say_conditional_hello"
end
Run Code Online (Sandbox Code Playgroud)
在我的用户模型中:
def self.say_conditional_hello
`echo "Hello"`
end
Run Code Online (Sandbox Code Playgroud)
关于此方法或任何新方法的任何建议将非常有帮助。
提前致谢!。
我在Rails应用程序中使用https://github.com/mperham/sidekiq gem在特定的日期和时间安排任务。例如:在约会安排时间之前10分钟发送约会提醒。
class TextWorker
include Sidekiq::Worker
def perform(appointer_id)
number = Usermodel.find_by_id(appointer_id).contact
Message.create(:from => email,
:to => number,
:body => 'Thank you...Your appointment is at 10/1/2015 Sun, at 12pm')
end
end
Run Code Online (Sandbox Code Playgroud)
并在约会控制器中在此处调用它:
class Appointments_controller
def create
TextWorker.delay_until(10/20/2014, 13:40).perform_async(@user_contact)
end
Run Code Online (Sandbox Code Playgroud)
delay_until不适用于特定的日期/时间:
还有其他方法可以在sideqik中的特定日期/时间执行任务吗?如果是这样怎么办?请
我在Ubuntu 14.04上的Docker容器中有一个Ruby on Rails应用程序.我使用Dokku设置部署,但我不确定如何让我的cron作业正常工作.
目前我正在使用every gem,它允许我做一些简单的事情:
every 5.minutes do
runner 'MyModel.run_something'
end
Run Code Online (Sandbox Code Playgroud)
问题是我认为每次使用git push dokku master
它部署时都会重置容器并将其设置回默认设置,从而删除所有我的cron时间表.
所以我想也许cron调度需要在容器外部而在VM级别.
无论我做什么,我目前都没有看到任何cron工作正在运行.这是当我crontab -l
在ssh'd 时运行时发生的事情:
root@dashboard:~# crontab -l
no crontab for root
Run Code Online (Sandbox Code Playgroud)
我对容器虚拟化很陌生,所以如果我跳过了关键部分,我很抱歉,但我很难过.
除了应用程序之外,如何在单独的不同 docker 容器中运行 sidekiq。我们在任何时候使用 sidekiq 作业,但这些作业在所有 Web 容器中都被触发
Run Code Online (Sandbox Code Playgroud)version: '3.8' services: foo-db: image: postgres:$POSTGRES_VERSION container_name: foo-db-container restart: unless-stopped env_file: .env volumes: - /var/lib/postgresql/data networks: - $FOO_NETWORK foo-redis: image: redis:$REDIS_VERSION container_name: foo-redis-container init: true sysctls: net.core.somaxconn: 511 env_file: .env volumes: - /var/lib/redis/data networks: - $FOO_NETWORK foo-sidekiq: depends_on: - foo-db - foo-redis build: ./foo-ui command: bundle exec sidekiq env_file: .env volumes: - /var/lib/redis/data networks: - $FOO_NETWORK foo-service: build: foo-service # image: gcr.io/foo/foo-service:latest …