Created
June 7, 2012 14:34
-
-
Save banyan/2889128 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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