【发布时间】: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