Skip to content

Instantly share code, notes, and snippets.

@katoy
Created November 30, 2013 12:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save katoy/7718753 to your computer and use it in GitHub Desktop.
Save katoy/7718753 to your computer and use it in GitHub Desktop.
using daemons.
# -*- coding: utf-8 -*-
require 'logger'
STDOUT.sync = true
STDERR.sync = true
def get_logger
ret = Logger.new(File.join(File.dirname(File.expand_path(__FILE__)), 'test.log'))
ret.level = Logger::INFO
ret
end
def show_message(str, logger = nil)
logger = get_logger unless logger
logger.info str
puts str
end
# Signal.trap(:HUP) { puts 'SIGHUPを受信' }
Signal.trap(:INT) { terminate 'SIGINTを受信' }
Signal.trap(:QUIT) { terminate 'SIGQUITを受信' }
Signal.trap(:KILL) { terminate 'SIGKILLを受信' }
Signal.trap(:TERM) { terminate 'SIGTERMを受信' }
Signal.trap(:INT) { terminate 'SIGINTを受信' }
Signal.trap(:QUIT) { terminate 'SIGQUITを受信' }
Signal.trap(:KILL) { terminate 'SIGKILLを受信' }
Signal.trap(:TERM) { terminate 'SIGTERMを受信' }
def terminate(str)
show_message(str)
exit 0
end
def my_task(logger)
show_message('start task', logger)
sleep 2
STDOUT.puts "# ----------- stdout #{Time.now}"
sleep 2
STDERR.puts "# ----------- stderr #{Time.now}"
sleep 2
show_message('end task', logger)
end
def main
logger = nil
loop do
if logger == nil
logger = get_logger
show_message('Logging start', logger)
end
my_task(logger)
sleep 2
end
end
main
# -*- coding: utf-8 -*-
# 開始
# ruby testdaemon.rb start
# 再起動
# ruby testdaemon.rb restart
# 終了
# ruby testdaemon.rb stop
#
require 'rubygems'
require 'daemons'
options = {
log_output: true,
}
Daemons.run(File.join(File.dirname(File.expand_path(__FILE__)), 'test.rb'), options)
ntsitm295139:lib youichikato$ cat testdaemon_1.rb
# -*- coding: utf-8 -*-
# See
# http://snippets.aktagon.com/snippets/212-how-to-create-a-daemon-process-using-ruby-and-the-daemons-rubygem
# > How to create a daemon process using Ruby and the daemons RubyGem
#
# 開始
# ruby testdaemon_1.rb start
# 再起動
# ruby testdaemon_1.rb restart
# 終了
# ruby testdaemon_1.rb stop
#
require 'rubygems'
require 'daemons'
file = File.join(File.dirname(File.expand_path(__FILE__)), 'test.rb')
options = {
log_output: true # stdout, stderr を test.rb.output に保持する
}
Daemons.run_proc('test.rb', # name of daemon
options) do
exec "ruby #{file}"
end
# -*- coding: utf-8 -*-
# See
# http://snippets.aktagon.com/snippets/212-how-to-create-a-daemon-process-using-ruby-and-the-daemons-rubygem
# > How to create a daemon process using Ruby and the daemons RubyGem
#
# http://wokowa.net/blog/archives/88
# > Rubyのdaemonsでloggerからログ出す方法がよく分からなかった話
#
# http://stackoverflow.com/questions/11237815/ruby-cant-write-to-logs-in-daemons
# > What does daemons internally do with my daemons?
#
# http://stackoverflow.com/questions/12266645/ruby-daemons-soft-stop
# > Ruby daemons soft stop
#
# 開始
# ruby testdaemon_2.rb start
# 再起動
# ruby testdaemon_2.rb restart
# 終了
# ruby testdaemon_2.rb stop
#
# -----------------------------------------
# task(logger) の処理を繰り返し実行する。
# task 実行中に daemon の stop , restart の指示, kill pid をされても、
# task の処理が途中で中断されることが無い様にした。
#
# $ tail -f test.log や $ tail -f test.rb.output を別コンソールで実行しながら
# damon の stop, resatret, kill pid を行うと様子がよくわかる。
#
# -----------------------------------------
# ruby: ruby 1.9.3p484 (2013-11-22 revision 43786) [i386-darwin9.8.0]
# gem: daemons (1.1.9)
require 'rubygems'
require 'daemons'
require 'logger'
CWD = File.expand_path(File.dirname(__FILE__))
STDOUT.sync = true
STDERR.sync = true
def task(logger)
# 時間がかかる処理を定義。
# 処理の途中で daemon の stop, restart を行いやすくしてある。
logger.info 'start task'
sleep 2; STDOUT.puts "# ------- task start #{Time.now}"
sleep 2; STDOUT.puts "# -- stdout #{Time.now}"
sleep 2; STDERR.puts "# -- stderr #{Time.now}"
sleep 2; STDOUT.puts "# ------- task end #{Time.now}"
logger.info 'fnish task'
end
# ------------------
def get_logger
ret = Logger.new('test.log')
ret.level = Logger::INFO
ret
end
def log_info(logger, str)
logger = get_logger unless logger
logger.info str
logger
end
def show_message(str)
puts str
log_info(nil, str)
end
options = {
log_output: true, # stdout, stderr を test.rb.output に保持する
multiple: false,
ontop: false,
backtrace: true,
monitor: false
}
Daemons.run_proc('test.rb', # name of daemon
options) do
stopped = false
logger = nil
Signal.trap(:INT) { stopped = true; show_message 'SIGINTを受信' }
Signal.trap(:QUIT) { stopped = true; show_message 'SIGQUITを受信' }
Signal.trap(:KILL) { stopped = true; show_message 'SIGKILLを受信' }
Signal.trap(:TERM) { stopped = true; show_message 'SIGTERMを受信' }
Dir.chdir CWD
until stopped
logger = show_message 'Start Daemon' if logger.nil?
task(logger)
sleep 2
end
show_message 'Finish Daemon'
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment