ruby'daemonized'脚本呈现意想不到的问题

时间:2013-04-19 19:34:32

标签: ruby daemons

我这里有一个突然改变行为的脚本,我无法理解为什么。据我所知,没有对脚本进行任何更改,也没有对红宝石或宝石进行任何更改。

首先,这是脚本:

require 'rubygems'
require 'daemons'
require 'beanstalk-client' 
require 'sequel'
require 'fileutils'
require 'chronic'

APP_DIR = File.dirname(File.expand_path(__FILE__))
ROOT_DIR = File.expand_path(File.join(APP_DIR,'..', '..'))
$LOAD_PATH.unshift(APP_DIR)
$LOAD_PATH.unshift(ROOT_DIR)
$LOAD_PATH.unshift(File.join(ROOT_DIR, 'lib'))
$LOAD_PATH.unshift(File.join(ROOT_DIR, 'db'))
$LOAD_PATH.unshift(File.join(ROOT_DIR, 'scripts'))
$LOAD_PATH.unshift(File.join(ROOT_DIR, 'models'))
$LOAD_PATH.unshift(File.join(ROOT_DIR, 'systems', 'shared', 'models'))

puts "Starting Daemon..."
Daemons.run_proc(File.join('var', 'background_jobs'), :log_output => true) do

  require 'environment'

  puts "renaming log file..."
  FileUtils.mkdir_p('var')
  begin 
    FileUtils.mv(File.join('var', 'background_jobs.output'), File.join('var', "#{Time.now.to_s.gsub(":","").gsub(" ", '_')}.log"))
  rescue
    # NOP
  end

  SequelOutput.prepare_database(MyDatabase::DB)
  beanstalk = Beanstalk::Pool.new(["0.0.0.0:11300"])
  loop do
    beanstalk_job = beanstalk.reserve 
    begin
      jh = beanstalk_job.ybody
      puts "processing #{jh[:job_id]}"
      job = MyDatabase::DB[:project__jobs].filter(:id => jh[:job_id]).first

      script_name = MyDatabase::DB[:project__available_tasks].filter(:id => job[:script_id]).get(:name)
      task = eval(camelize script_name).new(job)
      puts "processing script: #{script_name} aka (#{camelize script_name}) with #{task.steps} steps"

      task.process
      puts "finished #{jh[:job_id]}"
    rescue
      # NOP 
    end
    beanstalk_job.delete
  end
end

该脚本名为“run.rb”,其路径为/ var / www / main / projects / systems / background。此脚本由两个不同的bash脚本调用,位于“main”文件夹中。第一个名为“background_restart.sh”,调用ruby解释器和完全限定名称,如下所示:

cd /var/www/main
/usr/local/rvm/rubies/ruby-1.8.7-p249/bin/ruby /var/www/main/projects/systems/background/run.rb stop
/usr/local/rvm/rubies/ruby-1.8.7-p249/bin/ruby /var/www/main/projects/systems/background/run.rb start

现在失败了,只将“终止”输出到终端。另一个名为“deploy.sh”的脚本部署了Webapps,并以相同的输出失败(它的第一个和最后一个命令分别是停止和启动)。

我没有解释为什么这会突然失败。

其他一些注意事项:

  1. 如果我在后台目录中,则在终端中调用脚本的完全限定路径。
  2. 首先将bash脚本中的目录更改为“background”似乎可以解决问题,但对我来说有些不满意。
  3. 部署时会出现更多问题:
  4. 部署脚本基本上将当前生产代码移动到另一个目录,并将更新的代码放入其位置。当它重新启动时,我希望'run.rb'脚本在'background'中重新创建'var'文件夹(如第24行所示),但是守护进程gem会出现以下错误:

    Starting Daemon...
    /usr/local/rvm/gems/ruby-1.8.7-p249/gems/daemons-1.1.0/lib/daemons/pidfile.rb:94:in `initialize': No such file or directory - /var/www/main/projects/systems/background/var/background_jobs.pid (Errno::ENOENT)
        from /usr/local/rvm/gems/ruby-1.8.7-p249/gems/daemons-1.1.0/lib/daemons/pidfile.rb:94:in `open'
        from /usr/local/rvm/gems/ruby-1.8.7-p249/gems/daemons-1.1.0/lib/daemons/pidfile.rb:94:in `pid='
        from /usr/local/rvm/gems/ruby-1.8.7-p249/gems/daemons-1.1.0/lib/daemons/application.rb:254:in `start_proc'
        from /usr/local/rvm/gems/ruby-1.8.7-p249/gems/daemons-1.1.0/lib/daemons/application.rb:294:in `start'
        from /usr/local/rvm/gems/ruby-1.8.7-p249/gems/daemons-1.1.0/lib/daemons/controller.rb:70:in `run'
        from /usr/local/rvm/gems/ruby-1.8.7-p249/gems/daemons-1.1.0/lib/daemons.rb:193
        from /usr/local/rvm/gems/ruby-1.8.7-p249/gems/daemons-1.1.0/lib/daemons/cmdline.rb:112:in `call'
        from /usr/local/rvm/gems/ruby-1.8.7-p249/gems/daemons-1.1.0/lib/daemons/cmdline.rb:112:in `catch_exceptions'
        from /usr/local/rvm/gems/ruby-1.8.7-p249/gems/daemons-1.1.0/lib/daemons.rb:192:in `run_proc'
        from run.rb:19
    

    现在我可以通过在终端中创建'var'文件夹并再次运行它来解决这个问题,所以如果你想知道我为什么打扰你的人,我相信你们中的一些人会很感激这一点是一个我不想简单破解的问题。我想弄清楚这里发生的事情,并试着回到我之前的状态!

0 个答案:

没有答案