Skip to content

Instantly share code, notes, and snippets.

@banyan
Created June 7, 2012 14:34
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 banyan/2889128 to your computer and use it in GitHub Desktop.
Save banyan/2889128 to your computer and use it in GitHub Desktop.
def deamonize
# fork は2個返り値を返す
# 親プロセスは child's pid
# 子プロセスは nil
# 親プロセスは true, 子プロセスは false と評価され、
# 親プロセスは抜け、子プロセスが続く
exit if fork
# Process.setsid は新しいセッションを作成して、tty を切り離す
# セッションを生成するプロセスはプロセスグループのリーダー "以外" でなくてはならない
#
# 以下のように失敗する
# irb(main):001:0> Process.setsid
# Errno::EPERM: Operation not permitted
#
# そのため↑で先に fork して子プロセスで実行して成功させる
Process.setsid
# 更に fork して子プロセスを作り、
# もはやプロセスグループリーダーでもなく、セッションリーダーでもなく、
# そして端末 (terminal) への制御を失っているので、デーモンとしての振る舞いができる
exit if fork
# This isn't a strictly necessary とあるように current directory への影響しかない?
# 実際に umount やディレクトリやファイルを削除、リネームしてもデーモンは実行され続けた
# current に log を吐くみたいなデーモンはなくて、通常は /var/log 以下に吐かれるけど
# 一種のマナーとして、移動しておくと、もしそういう実装をしてても問題がおきないよね、程度の話なのかな?
Dir.chdir "/"
# reopen は redirect
# "a" ファイルポインタをファイルの終端に置いているのは分からない。
# "/dev/null" だけじゃダメなのか
STDIN.reopen "/dev/null"
STDOUT.reopen "/dev/null", "a"
STDERR.reopen "/dev/null", "a"
end
deamonize
loop do
sleep 1
p Time.now
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment