我有一个问题让delayed_job脚本工作。Rails - Delayed_job启动脚本无法启动(command.rb:73:在`mkdir:文件存在)
delayed_job rake任务“rake jobs:work”在开发和生产环境中工作正常。但是,当我尝试使用该脚本,我得到以下错误启动它:
user:~/rails1/current$ RAILS_ENV=production script/delayed_job start
/home/user/rails1/shared/bundle/ruby/1.9.1/gems/delayed_job-4.0.0/lib/delayed/command.rb:73:in `mkdir': File exists - /home/user/rails1/releases/20131218094848/tmp/pids (Errno::EEXIST)
from /home/user/rails1/shared/bundle/ruby/1.9.1/gems/delayed_job-4.0.0/lib/delayed/command.rb:73:in `daemonize'
from script/delayed_job:5:in `<main>'
据我所知,在delayed_job的库文件command.rb(https://github.com/collectiveidea/delayed_job/blob/master/lib/delayed/command.rb)
def daemonize
dir = @options[:pid_dir]
Dir.mkdir(dir) unless File.exists?(dir)
if @worker_count > 1 && @options[:identifier]
raise ArgumentError, 'Cannot specify both --number-of-workers and --identifier'
elsif @worker_count == 1 && @options[:identifier]
process_name = "delayed_job.#{@options[:identifier]}"
run_process(process_name, dir)
else
worker_count.times do |worker_index|
process_name = worker_count == 1 ? "delayed_job" : "delayed_job.#{worker_index}"
run_process(process_name, dir)
end
end
end
此代码段
这是我的错误。
如错误消息所示,目录tmp/pids存在。但是在代码中有一个“除非”从句,说明它不应该在它存在的情况下被创建。那么为什么脚本试图制作目录?
我在开发环境中生成了脚本。对环境敏感吗?这是脚本:
#!/usr/bin/env ruby
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment'))
require 'delayed/command'
Delayed::Command.new(ARGV).daemonize
有没有人有线索?只是为了您的信息:delayed_job需要的守护进程gem位于我的gem文件中。
更新: 我在我的开发机器上本地尝试启动脚本,它在那里工作。但它仍然在我的生产机器上失败。所以rake任务“rake jobs:work”在我的开发机器和生产服务器上工作,但script/delayed_job中的脚本只能在我的本地开发机器上工作。
它什么时候在生产中工作,什么时候不生产?这部分对我来说并不完全清楚。当你手动启动时,它有可能起作用,而且当你通过Capistrano进行部署时,它有可能会起作用吗? – janfoeh
它只能通过rake任务工作。无论是在开发和生产。但是脚本不起作用。但是我只在生产服务器上试过这个脚本,因为在我的本地机器上,我使用ubuntu在一个挂载的NTFS分区上工作。在那里,我没有脚本的执行权限。我必须在ubuntu分区上移动它以在本地尝试。现在就做,更新帖子! – coderuby
什么脚本不起作用? – janfoeh