mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
demo script for demonizing using fork exec
minor refinements to demon
This commit is contained in:
parent
6dad7dfcec
commit
fc05164667
@ -7,10 +7,10 @@ class Demon::Base
|
|||||||
@demons
|
@demons
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.start(count = 1)
|
def self.start(count = 1, verbose: false)
|
||||||
@demons ||= {}
|
@demons ||= {}
|
||||||
count.times do |i|
|
count.times do |i|
|
||||||
(@demons["#{prefix}_#{i}"] ||= new(i)).start
|
(@demons["#{prefix}_#{i}"] ||= new(i, verbose: verbose)).start
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -38,16 +38,18 @@ class Demon::Base
|
|||||||
attr_reader :pid, :parent_pid, :started, :index
|
attr_reader :pid, :parent_pid, :started, :index
|
||||||
attr_accessor :stop_timeout
|
attr_accessor :stop_timeout
|
||||||
|
|
||||||
def initialize(index)
|
def initialize(index, rails_root: nil, parent_pid: nil, verbose: false)
|
||||||
@index = index
|
@index = index
|
||||||
@pid = nil
|
@pid = nil
|
||||||
@parent_pid = Process.pid
|
@parent_pid = parent_pid || Process.pid
|
||||||
@started = false
|
@started = false
|
||||||
@stop_timeout = 10
|
@stop_timeout = 10
|
||||||
|
@rails_root = rails_root || Rails.root
|
||||||
|
@verbose = verbose
|
||||||
end
|
end
|
||||||
|
|
||||||
def pid_file
|
def pid_file
|
||||||
"#{Rails.root}/tmp/pids/#{self.class.prefix}_#{@index}.pid"
|
"#{@rails_root}/tmp/pids/#{self.class.prefix}_#{@index}.pid"
|
||||||
end
|
end
|
||||||
|
|
||||||
def alive?(pid = nil)
|
def alive?(pid = nil)
|
||||||
@ -153,8 +155,15 @@ class Demon::Base
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def verbose(msg)
|
||||||
|
if @verbose
|
||||||
|
puts msg
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def write_pid_file
|
def write_pid_file
|
||||||
FileUtils.mkdir_p(Rails.root + "tmp/pids")
|
verbose("writing pid file #{pid_file} for #{@pid}")
|
||||||
|
FileUtils.mkdir_p(@rails_root + "tmp/pids")
|
||||||
File.open(pid_file, 'w') do |f|
|
File.open(pid_file, 'w') do |f|
|
||||||
f.write(@pid)
|
f.write(@pid)
|
||||||
end
|
end
|
||||||
@ -190,7 +199,7 @@ class Demon::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def establish_app
|
def establish_app
|
||||||
Discourse.after_fork
|
Discourse.after_fork if defined?(Discourse)
|
||||||
|
|
||||||
Signal.trap("HUP") do
|
Signal.trap("HUP") do
|
||||||
begin
|
begin
|
||||||
|
31
script/demon_test/child
Executable file
31
script/demon_test/child
Executable file
@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
|
$parent_pid = ARGV[0].to_i
|
||||||
|
|
||||||
|
puts "Hello from #{Process.pid} my parent is #{$parent_pid}"
|
||||||
|
|
||||||
|
Thread.new do
|
||||||
|
|
||||||
|
def alive?(pid)
|
||||||
|
Process.kill(0, pid)
|
||||||
|
true
|
||||||
|
rescue
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
while true
|
||||||
|
begin
|
||||||
|
unless alive?($parent_pid)
|
||||||
|
STDERR.puts "Parent was terminated!"
|
||||||
|
Process.kill "TERM", Process.pid
|
||||||
|
sleep 10
|
||||||
|
Process.kill "KILL", Process.pid
|
||||||
|
end
|
||||||
|
rescue => e
|
||||||
|
STDERR.puts "URGENT monitoring thread had an exception #{e}"
|
||||||
|
end
|
||||||
|
sleep 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sleep
|
25
script/demon_test/parent.rb
Normal file
25
script/demon_test/parent.rb
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
require File.expand_path("../../../config/environment", __FILE__)
|
||||||
|
|
||||||
|
puts "Parent is now loaded"
|
||||||
|
|
||||||
|
class ForkExecDemon < Demon::Base
|
||||||
|
def self.prefix
|
||||||
|
"fork-exec-child"
|
||||||
|
end
|
||||||
|
|
||||||
|
def run
|
||||||
|
if @pid = fork
|
||||||
|
write_pid_file
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
exec "./child #{parent_pid}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ForkExecDemon.start(1, verbose: true)
|
||||||
|
|
||||||
|
while true
|
||||||
|
ForkExecDemon.ensure_running
|
||||||
|
sleep 0.1
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user