3

tl;dr: rackup -p 1234<= 動作します。rackup -p 1234 -D<= はゾンビを作成します。なんで?

別のファイルにサポート機能を備えた Grape API サーバーを実行しています。私の目的は、サーバーの起動時に、特定のフラグを持つデータが見つかった場合に一定間隔でデータベースに ping を実行し、いくつかのアクションを実行するサポート関数で定義された、長時間実行される個別のバックグラウンド プロセスを作成することです。サーバーがデーモンとしてラックアップされるまで、これは完全に機能します。デーモンとしてラックアップすると、サーバーへの呼び出しごとにゾンビ プロセスが作成されます。

なんで?ゾンビ、フォークなどについてできることを読みましたが、いくつかの重要な概念が欠けているに違いありません...

ラック構成 (config.ru)

require './server.rb'

run Application::API

ぶどうサーバー (server.rb)

require_relative 'support.rb'
module Application
  class API < Grape::API
    helpers do
      def current_runner
        @current_runner ||= Run.new
      end
      # ...
    end
    resource :tests do
      post :create do
        current_runner # <= Edit: forgot to copy this over 
        @current_runner.create
      end
      get :lookup do
        current_runner # <= Edit: forgot to copy this over 
        @current_runner.lookup
      end
      # ...
    end
  end
end

サポート機能 (support.rb)

class Run
  def initialize
    # ...   
    test_untested
  end
  # ... other non-forked functions including 'lookup' and 'create'
  def test_untested
    # Text file with process ID to protect from duplicate listeners
    pid = ""
    File.open("processid.txt", "r") do |f|
      f.each_line do |line|
        pid << line
      end
    end
    pid = pid.to_s.gsub(/[^0-9]/, "").to_i
    # If the process responds to kill signal 0
    # a listener is still alive, and we need to exit
    pid_active = nil
    unless pid < 100
      begin
        pid_active = true if ((Process.kill 0, pid) > 0)
      rescue Errno::ESRCH => e
        pid_active = false
      end
    end
    unless pid_active
      Process.fork do # Tried Process.daemon -- it never runs.
        Process.detach(Process.pid) # <= Also tried 'Process.setsid' instead ...
        # Application logic ...
      end
    end
  end
end
r = Run.new

編集: 参考までに: 私は 2 コア 32 ビット CentOS 6.5 サーバーを使用しています。

4

1 に答える 1