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>'
4

2 に答える 2

5

許可の問題があります。

簡単に言えば、別のユーザーの下で実行されている遅延ジョブがあり (おそらくrootを使用しているためrvmsudo)、デーモン spawn がそれを強制終了しようとしています。を取得しOperation not permittedます。

最初に rvmsudo でdelayed_jobを強制終了してみてください。それが実行されていないことを確認してから ( を試してくださいps aux)、 なしで開始してみてくださいrvmsudo

それはうまくいくはずです。

于 2012-07-01T04:53:46.393 に答える
4

まず、shared/pids/delayed_job.pid を見て、プロセスが実行されているかどうかを確認します。私の場合、それはクリーンにシャットダウンされていないように見え、pid ファイルはそのまま残されていました。Deploy スクリプトが存在しないプロセスを強制終了しようとしており、その許可エラーが発生していました。

delayed_job.pid を削除し、デプロイに成功しました。

于 2012-11-29T11:06:33.673 に答える