为什么没有RVM就无法执行延迟作业(delayed_job)?

4

我安装了delayed_job,并使用以下Ruby脚本启动守护程序来运行作业:

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)

如果我使用rvmsudo命令运行,它可以完美地工作。

如果我不使用RVM,只是使用Ruby命令,它将失败并输出以下内容。我不知道为什么会发生这种情况。你能给我一些线索吗?

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>'
2个回答

5
您出现了权限问题。
简单来说:您正在另一个用户(可能是由于使用了rvmsudo而导致的root)下运行延迟的工作,而守护进程生成正在尝试杀死它。您将收到“操作不允许”的错误信息。
请尝试首先使用rvmsudo杀掉delayed_job,并确保它未在运行(可以尝试使用ps aux命令),然后再尝试不使用rvmsudo启动。
这样应该就能解决问题了。

4

首先,查看shared/pids/delayed_job.pid文件,检查进程是否在运行。在我的情况下,它似乎关闭不干净并且pid文件保留在原地。部署脚本尝试终止不存在的进程并出现了权限错误。

我删除了delayed_job.pid文件,然后部署成功了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接