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 サーバーを使用しています。