问题
I have a delayed_job
installed, and I start the daemon to run the jobs with this Ruby script:
require 'rubygems'
require 'daemon_spawn'
$: << '.'
RAILS_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
class DelayedJobWorker < DaemonSpawn::Base
def start(args)
ENV['RAILS_ENV'] ||= args.first || 'development'
Dir.chdir RAILS_ROOT
require File.join('config', 'environment')
Delayed::Worker.new.start
end
def stop
system("kill `cat #{RAILS_ROOT}/tmp/pids/delayed_job.pid`")
end
end
DelayedJobWorker.spawn!(:log_file => File.join(RAILS_ROOT, "log", "delayed_job.log"),
:pid_file => File.join(RAILS_ROOT, 'tmp', 'pids', 'delayed_job.pid'),
:sync_log => true,
:working_dir => RAILS_ROOT)
If I run the command with rvmsudo
it works perfectly.
If I simply use the Ruby command without RVM it fails and this is the output. I have no idea why this happens. Could you give me some clue?
user@mysystem:~/redeal.it/application$ ruby script/delayed_job start production
/usr/local/rvm/gems/ruby-1.9.3-p194/gems/daemon-spawn-0.4.2/lib/daemon_spawn.rb:16:in `kill': Operation not permitted (Errno::EPERM)
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/daemon-spawn-0.4.2/lib/daemon_spawn.rb:16:in `alive?'
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/daemon-spawn-0.4.2/lib/daemon_spawn.rb:125:in `alive?'
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/daemon-spawn-0.4.2/lib/daemon_spawn.rb:176:in `block in start'
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/daemon-spawn-0.4.2/lib/daemon_spawn.rb:176:in `select'
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/daemon-spawn-0.4.2/lib/daemon_spawn.rb:176:in `start'
from /usr/local/rvm/gems/ruby-1.9.3-p194/gems/daemon-spawn-0.4.2/lib/daemon_spawn.rb:165:in `spawn!'
from script/delayed_job:37:in `<main>'
回答1:
You have a permission issue.
Putting it simply: You have a delayed job running under another user (proprably root
due to using rvmsudo
), and daemon spawn is trying to kill it. You will get an Operation not permitted
.
Try killing delayed_job first with rvmsudo, make sure it is not running (try ps aux
) and then try to start without rvmsudo
.
It should work.
回答2:
First, take a look at shared/pids/delayed_job.pid and see if process is running. In my case it looked like it was shut down unclean and pid file was left in place. Deploy script was trying to kill non-existing process and was giving that permission error.
I have deleted delayed_job.pid and deploy succeeded.
来源:https://stackoverflow.com/questions/11279267/why-does-my-delayed-job-fail-without-rvm