我有一个标记为由delayed_job异步处理的函数:
class CapJobs
def execute(params, id)
begin
unless Rails.env == "test"
Capistrano::CLI.parse(params).execute!
end
rescue
site = Site.find(id)
site.records.create!(:date => DateTime.now, :action => "Task Failure: #{params[0]}", :type => :failure)
site.save
ensure
yield id
end
end
handle_asynchronously :execute
end
Run Code Online (Sandbox Code Playgroud)
当我运行这个函数时,我传入一个块:
capjobs = CapJobs.new
capjobs.execute(parameters, @site.id) do |id|
asite = Site.find(id)
asite.records.create!(:date => DateTime.now, :action => "Created", :type => :init)
asite.status = "On Demo"
asite.dev = true
asite.save
end
Run Code Online (Sandbox Code Playgroud)
这在没有delayed_job的情况下运行时工作正常,但是当使用它运行时我得到以下错误
2012-08-13T09:24:36-0300: [Worker(delayed_job host:eagle pid:12089)] SitesHelper::CapJobs#execute_without_delay failed with LocalJumpError: no block given (yield) - …Run Code Online (Sandbox Code Playgroud) 我使用monit来监控几个进程.这些过程包括乘客实例和我编写的守护进程,为乘客实例生成pidfiles.Monit将启动这些过程没有问题.它不会阻止他们.以下是守护进程的Monit配置:
check process passenger_monitor with pidfile <%= passenger_monitor_pid %>
group <%= application %>
start program = "/bin/su - rails_apps -c 'source /home/rails_apps/.rvm/scripts/rvm; /home/rails_apps/passenger_monitor.rb'"
stop program = "/bin/kill `/bin/cat <%= passenger_monitor_pid %>`"
Run Code Online (Sandbox Code Playgroud)
这是一个通过capistrano生成的erb模板.如果我通过终端以最小的环境以root身份运行stop命令,那么它可以工作,但当我请求Monit停止进程时,我收到以下错误:
[ADT Sep 17 10:38:31] error : 'passenger_monitor' failed to stop
Run Code Online (Sandbox Code Playgroud)
我已经尝试了我能想到的一切.我无法找到或生成stop命令输出的任何日志.