Rubyでデーモンを作ってみる
Rubyでデーモンを作ってみます。
test.txtファイルに1秒ごとに"test"と書き続けるデーモンです。
# daemon.rb require 'fileutils' require 'logger' class DaemonTest def initialize @term = false @logger = Logger.new(STDOUT) @logger.info "daemon start..." @pid_file_path = './daemon.pid' @file = "./test.txt" end def execute File.open(@file, "w") do |f| loop do f.puts "test" f.flush break if @term sleep 1 end end end def run daemonize begin Signal.trap(:TERM) { shutdown } Signal.trap(:INT) { shutdown } execute rescue => ex @logger.error ex end end def shutdown @term = true @logger.info "daemon close..." @logger.close FileUtils.rm @pid_file_path end def daemonize exit!(0) if Process.fork Process.setsid exit!(0) if Process.fork open_pid_file end def open_pid_file begin open(@pid_file_path, 'w') {|f| f << Process.pid } if @pid_file_path rescue => ex @logger.error "could not open pid file (#{@pid_file_path})" @logger.error "error: #{ex}" @logger.error ex.backtrace * "\n" end end end DaemonTest.new.run
起動
$ ruby daemon.rb
停止
$ cat daemon.pid | xargs kill