1

ここにあるスクリプトの動作が突然変化しましたが、その理由がわかりません。私の知る限り、スクリプトは変更されておらず、ルビーや宝石も変更されていません。

まず、スクリプトは次のとおりです。

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 です。このスクリプトは、「メイン」フォルダーにある 2 つの異なる bash スクリプトによって呼び出されます。'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

これは失敗し、端末にのみ 'Terminated' を出力します。「deploy.sh」と呼ばれるもう 1 つのスクリプトは Web アプリケーションをデプロイし、同じ出力で失敗します (最初と最後のコマンドはそれぞれ停止と開始です)。

これが突然失敗し始めた理由については説明がありません。

その他の注意事項:

  1. バックグラウンドディレクトリにいる場合、ターミナルでスクリプトの完全修飾パスを呼び出すと機能します。
  2. bashスクリプトのディレクトリを「バックグラウンド」に変更すると、最初は問題が解決されたように見えますが、私には少し満足できません。
  3. 展開すると、さらに問題が発生します。

deploy スクリプトは基本的に、現在の本番コードを別のディレクトリに移動し、更新されたコードをその場所に配置します。再起動すると、「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' フォルダーを作成して再度実行するだけで、これを修正できます。単にハッキングしたくないということです。ここで何が起こったのかを解明し、以前の状態に戻そうとします!

4

0 に答える 0