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 <== これ :
[ツッコミを入れる]











