【问题标题】:Rails - Delayed_job start script don't start (command.rb:73:in `mkdir': File exists)Rails - Delayed_job 启动脚本不启动(command.rb:73:in `mkdir': 文件存在)
【发布时间】:2013-12-18 11:10:22
【问题描述】:

我在让延迟作业脚本工作时遇到问题。

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 lib 文件 command.rb (https://github.com/collectiveidea/delayed_job/blob/master/lib/delayed/command.rb) 中有这段代码 sn-p

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 位于我的 gemfile 中。

更新: 我现在在我的开发机器上本地尝试了启动脚本,它在那里工作。但它在我的生产机器上仍然失败。所以 rake 任务“rake jobs:work”在我的开发机器和生产服务器上工作,但 script/delayed_job 中的脚本只在我的本地开发机器上工作。

【问题讨论】:

  • 它什么时候在生产中起作用,什么时候不起作用?那部分对我来说并不完全清楚。是否有可能在您手动启动时有效,而通过 Capistrano 部署时无效?
  • 它只能通过 rake 任务工作。无论是在开发中还是在生产中。但是脚本不起作用。但是我只在生产服务器上尝试了该脚本,因为在我的本地机器上,我使用 ubuntu 在一个挂载的 ntfs 分区上工作。而且我没有脚本的执行权。我必须将它转移到 ubuntu 分区上才能在本地尝试。现在会做并更新帖子!
  • 什么脚本不起作用?
  • script/delayed_job 中的delayed_job 脚本不起作用,您可以将其与RAILS_ENV=production script/delayed_job start 一起将delayed_job 作为服务启动。我将我的 rails 应用程序复制到 ubuntu 分区以更改延迟作业脚本的执行权限。在我的本地开发机器上,它启动良好。但是在我的生产服务器上,我仍然收到帖子中提到的错误。

标签: ruby-on-rails daemon delayed-job


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    要添加此内容,您需要将 tmp 保留在 .gitignore 中,因此只需在目录中添加一个空文件并执行

    git add tmp/pids/empty -f
    

    将目录结构放入您的版本控制中。

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 2021-03-24
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      相关资源
      最近更新 更多