2013-12-18 30 views
1

我有一个问题让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中的脚本只能在我的本地开发机器上工作。

+0

它什么时候在生产中工作,什么时候不生产?这部分对我来说并不完全清楚。当你手动启动时,它有可能起作用,而且当你通过Capistrano进行部署时,它有可能会起作用吗? – janfoeh

+0

它只能通过rake任务工作。无论是在开发和生产。但是脚本不起作用。但是我只在生产服务器上试过这个脚本,因为在我的本地机器上,我使用ubuntu在一个挂载的NTFS分区上工作。在那里,我没有脚本的执行权限。我必须在ubuntu分区上移动它以在本地尝试。现在就做,更新帖子! – coderuby

+0

什么脚本不起作用? – janfoeh

回答

2

我找到了解决方案。 tmp/pids是通过我的主机的capistrano配方创建的符号链接。它链接到共享文件夹。但相应的目录不在那里。创建它解决了问题!

0

要添加到这一点,你会希望保持TMP在你的.gitignore,所以只需添加一个空文件的目录,并做了

git add tmp/pids/empty -f 

得到的目录结构到你的版本控制。