2010-01-13 :-)
_ 朝ッ
0530 起床
_ [Ruby][NetBSD][Unix][daemon]daemon の書き方
( via 僕たちが待ち望んでいたRubyスクリプトをデーモン化する方法 - (rubikitch loves (Emacs Ruby CUI)) )
Ruby 1.9 での書き方が紹介されてる。こうだそうな
Process.daemon
Ruby 1.9 以前の場合、QuickML の quickml/quickml.in を眺めると手で書いている。umask 022 ?
def be_daemon exit!(0) if fork Process::setsid exit!(0) if fork Dir::chdir("/") File::umask(022) STDIN.reopen("/dev/null", "r+") STDOUT.reopen("/dev/null", "r+") STDERR.reopen("/dev/null", "r+") end
C で書くとこう =)
#include <stdlib.h> int main( int ac, char** av) { daemon( 1, 1 ); for(;;); return 0; }
手で書くとこうっていうか NetBSD の src/lib/libc/gen/daemon.c 実装。src/lib/libc/stdlib にあると思って目で探したけど見つけられなかったのでググった( "daemon" package:netbsd lang:c - Google ソースコード検索 ) gen にあった。
int daemon(nochdir, noclose) int nochdir, noclose; { int fd; switch (fork()) { case -1: return (-1); case 0: break; default: _exit(0); } if (setsid() == -1) return (-1); if (!nochdir) (void)chdir("/"); if (!noclose && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) { (void)dup2(fd, STDIN_FILENO); (void)dup2(fd, STDOUT_FILENO); (void)dup2(fd, STDERR_FILENO); if (fd > STDERR_FILENO) (void)close(fd); } return (0); }
プロセスはこんな
% ps axj USER PID PPID PGID SESS JOBC STAT TTY TIME COMMAND root 0 0 0 a3f3e0 0 DKl ? 4:35.89 [system] root 1 0 1 5d6bc4 0 Is ? 0:04.28 init root 87 1 87 689104 0 IWs ? 1:21.05 SCREEN (screen-4.0.3) root 165 1 165 5d6c14 0 Ss ? 0:03.51 /usr/sbin/syslogd -s root 303 1 303 5d6c64 0 Is ? 0:00.77 /usr/sbin/sshd root 347 1 347 5d6c8c 0 Ss ? 0:04.61 /usr/libexec/postfix/master root 404 1 404 5d6cb4 0 IWs ? 0:00.01 /usr/sbin/inetd -l root 406 1 406 5d6cdc 0 Is ? 0:02.50 /usr/sbin/cron postfix 423 347 347 5d6c8c 0 I ? 0:01.26 qmgr -l -t unix -u root 442 1 442 87134c 0 IWs ? 0:03.76 SCREEN (screen-4.0.3) postfix 1144 347 347 5d6c8c 0 S ? 0:00.07 pickup -l -t fifo -u root 2183 1 2183 9d7428 0 IWs ? 0:01.23 SCREEN (screen-4.0.3) rin 4545 1 4545 af78c0 0 Rs ? 10:04.92 ./a.out <== これ :