我试图使用每天执行rake任务onces一天.我得到这个错误
/bin/bash: bundle: command not found
/home/app/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:247:in `to_specs': Could not find bundler (>= 0) amongst [minitest-1.6.0, rake-0.8.7, rdoc-2.5.8] (Gem::LoadError)
from /home/app/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:256:in `to_spec'
from /home/app/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems.rb:1210:in `gem'
from /home/app/.rvm/gems/ruby-1.9.2-p180/bin/bundle:18:in `<main>'
Run Code Online (Sandbox Code Playgroud)
这是我的crontab
# Begin Whenever generated tasks for: /home/af/www/app/releases/20120216172204/config/schedule.rb
PATH=/home/af/.rvm/gems/ruby-1.9.2-p180@global/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
0 0 * * * /bin/bash -l -c 'cd /home/af/www/app/releases/20120216172204 && rvm 1.9.1-p180; RAILS_ENV=production /home/af/.rvm/gems/ruby-1.9.2-p180/bin/bundle exec rake daily:stats --silent >> /home/af/www/app/releases/20120216172204/log/cron.log 2>&1'
# End Whenever generated tasks for: /home/af/www/app/releases/20120216172204/config/schedule.rb
Run Code Online (Sandbox Code Playgroud)
我不知道为什么它不起作用.如果我运行命令:
cd /home/af/www/app/releases/20120216172204 && rvm 1.9.1-p180; RAILS_ENV=production /home/af/.rvm/gems/ruby-1.9.2-p180/bin/bundle exec rake daily:stats --silent >> /home/af/www/app/releases/20120216172204/log/cron.log …
Run Code Online (Sandbox Code Playgroud) 我创建了一个使用随时随地宝石的应用程序.宝石创造了cron工作.我让它在本地工作,但似乎无法让它在heroku雪松上工作.执行此操作的命令是什么?
运行:
heroku run whenever --update-crontab job1
Run Code Online (Sandbox Code Playgroud)
不起作用
对不起快速问题来自相关的Rails新手.我正在尝试使用Whenever gem来安排一些rake任务.我不能为我的生活让它真正开始在我的开发机器上运行cron作业.
从其他stackoverflow线程来看,似乎我应该添加:
set :environment, "development"
Run Code Online (Sandbox Code Playgroud)
到我的schedule.rb文件.但那又怎样?
然后,一旦他们开始,我该如何停止cron工作?
在OSX中使用Rails 3.2.3
更新:答案是运行$ whenever -w
将cron作业写入crontab文件.然后系统立即开始自动运行该crontab文件.
不幸的是,我的日志文件包含以下内容:
"rake aborted! Don't know how to build task <task name>"
我想这可能是由于已知的crontab/rvm问题,但欢迎任何建议.
如果您了解创建cron作业的gem,那么这个问题可能才有意义.我的schedule.rb中有一项任务
every 1.day, :at => '4am' do
command "cd #{RAILS_ROOT} && rake thinking_sphinx:stop RAILS_ENV=#{RAILS_ENV}"
command "cd #{RAILS_ROOT} && rake thinking_sphinx:index RAILS_ENV=#{RAILS_ENV}"
command "cd #{RAILS_ROOT} && rake thinking_sphinx:start RAILS_ENV=#{RAILS_ENV}"
end
Run Code Online (Sandbox Code Playgroud)
但是,当我使用更新我的crontab时
whenever --update-crontab appname --set environment=production
Run Code Online (Sandbox Code Playgroud)
cron作业仍然有RAILS_ENV =开发.我的生产和开发任务现在是一样的,我只需要改变环境变量,因为thinking_sphinx需要知道当前的环境.关于如何做到这一点的任何想法?
谢谢!
这是我第一次异步处理作业我在我的应用程序中实现Sidekiq进行后台处理.我会将它用于提醒电子邮件和应用内通知.我很困惑我是否应该使用Active Job创建一个发送电子邮件的工作或者Sidekiq Worker来发送电子邮件.他们似乎做同样的事情,Rails 4.2 Active Job似乎很新......它是否取代了对Sidekiq工作者的需求?
以下是使用Active Job作业和Sidekiq Worker发送邮件代码的相同内容.我正在使用Whenever gem进行调度.
my_mailers.rb
class MyMailers < ActionMailer::Base
def some_mailer(r.user_id)
@user = User.find(r.user_id)
mailer_name = "ROUNDUP"
@email = @user.email
@subject ="subject text"
mail(to: @email,
subject: @subject,
template_path: '/notifer_mailers',
template_name: 'hourly_roundup.html',
)
end
end
Run Code Online (Sandbox Code Playgroud)
使用Sidekiq"Worker"
some_worker.rb
class SomeWorker
include Sidekiq::Worker
def perform()
@user = User.all
@reminders = @user.reminders.select(:user_id).uniq.newmade
@reminders.each do |r|
MyMailers.some_mailer(r.user_id).deliver_later
end
end
end
Run Code Online (Sandbox Code Playgroud)
使用活动作业"作业"
some_job.rb
class SomeJob < ActiveJob::Base
queue_as :mailer
def perform()
@user = User.all
@reminders = @user.reminders.select(:user_id).uniq.newmade
@reminders.each do |r| …
Run Code Online (Sandbox Code Playgroud) 这个问题可能只意义,如果你知道的,只要创业板创造的cron作业.
对于我的应用程序,我想whenever
在所有环境中使用,包括测试和开发.
我schedule.rb
看起来像这样:
set :output, {
:error => "#{path}/log/error.log",
:standard => "#{path}/log/cron.log"
}
set :environment, Rails.env.to_sym
every 5.minutes do
rake 'db:activity:synchronize'
end
Run Code Online (Sandbox Code Playgroud)
但它失败了Rails.env.to_sym
(同样代表 RAILS_ENV
):
/home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/job_list.rb:21:in `eval': uninitialized constant Whenever::JobList::Rails (NameError)
from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/job_list.rb:21:in `eval'
from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/job_list.rb:21:in `initialize'
from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever.rb:15:in `new'
from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever.rb:15:in `cron'
from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/command_line.rb:41:in `run'
from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/command_line.rb:8:in `execute'
from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/bin/whenever:38:in `<top (required)>'
from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/bin/whenever:19:in `load'
from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/bin/whenever:19:in `<main>'
Run Code Online (Sandbox Code Playgroud)
所以,我的问题基本归结为:
whenever
在所有环境中使用?我的红宝石在/ usr/local/bin中.无论何时找不到它,并且在我的cron文件顶部设置PATH也不起作用,我认为因为无论何时在新的bash实例中运行命令.
# this does not work PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin # Begin Whenever generated tasks for: foo 0 * * * * /bin/bash -l -c 'cd /srv/foo/releases/20110429110637 && script/rails runner -e production '\''ActiveRecord::SessionStore::Session.destroy_recent(15)'\''' # End Whenever generated tasks for: foo
我怎么能告诉我的ruby二进制文件在哪里?从/ usr/bin创建一个符号链接对我来说似乎很混乱,但我想这可能是唯一的选择.
这个问题提供了env :PATH, "..."
在schedule.rb作为一个解决方案,但(一)我无法找到该功能的任何文档中的文档(二)它似乎并没有已经解决了提问者的问题,任何地方(不幸的是它需要不平凡转机时间让我试试吧).
实际更新它在这个页面的底部,我现在就试试吧.
更多信息
bash -l
,/ usr/bin/env发现ruby就好了所以,这很神秘......
我有一个包含大量任务的应用程序,每天我都想运行一个cron作业,为数据库中的每个Task创建一个DayTask.任务has_many DayTasks和这些daytasks是用户每天将要检查的.我正在使用随时随地的宝石,但它似乎根本没有运行.有任何想法吗?
配置/ schedule.rb
every 1.day, :at => "12:01am" do
runner "Task.generate_tasks_for_day"
end
Run Code Online (Sandbox Code Playgroud)
Task.rb
def generate_tasks_for_day
Task.all.each do |task|
task.day_tasks.create(:target_date => Date.today)
end
end
Run Code Online (Sandbox Code Playgroud)
运行'when命令'的结果
1 0 * * * /bin/bash -l -c 'cd /home/grant/rails_projects/GoalTwist && script/rails runner -e production '\''Task.generate_tasks_for_day'\'''
Run Code Online (Sandbox Code Playgroud)
注意:每次我想测试运行时,我一直在更改config/schedule.rb中的时间.
出于惊人的目的,我试图安排工作每2分钟一次,每5分钟一次.那就是我想要1个工作来运行1,6,11,16 ..而另一个工作要运行在2,7,12,17 ......
我找不到这样做的例子.所以我尝试过:
every 5.minutes, :at=> 1 do
command "echo 'you can use raw cron sytax too'"
end
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但所有':at'示例看起来都期待一个字符串格式的时间.以上是有效的,或者只是恰好工作,并且每个选项都不支持起始时间.
我在互联网上搜索了这个,文档并没有真正谈论具体的月度工作.所以我希望有人可以告诉我该怎么做.
我已经安装了随时随地的宝石,我需要知道的是正确的语法:
every :month, :on => '20th', :at => '02:00' do
runner "Mailer.send_friend_sheet"
end
Run Code Online (Sandbox Code Playgroud)
希望有人能指出我正确的方向..
谢谢!