トップ «前の日記(2010-01-12) 最新 次の日記(2010-01-14)» 編集

ヨタの日々

2001|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2010-01-13 :-)

_ 朝ッ

0530 起床

_ 仕事

0830 出勤

1000 客先

1200 自社

_ [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              <== これ
 :