Working with Unix Processes の Daemon Processes を社内勉強会で読んだメモ

Working with Unix Processes の Daemon Processes を社内勉強会で読んだ。 以前さらっと読んだ時はふんふん...なるほどーとか読みながら読めたけど すごい忘れてるし、そもそもじっくり話しながら読んだら自分は全然理解できてないことが分かった。

ので改めて読んでメモしとく。 まだ理解曖昧な部分はアップデートしていきたい

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
view raw deamonize.rb hosted with ❤ by GitHub