daemontools HOW-TO ($B&AHG(B)

Copyright 2000 $BBl_7(B $BN4;K(B <[email protected]>
Last modified: Sun Nov 19 19:29:10 2000

$BA0=q$-(B

$B$3$NJ8=q$O(B DJB $B;a$N(B daemontools $B%Q%C%1!<%8$K6=L#$r;}$?$l$kJ}$d$3$l$+$iF3F~!&1?MQ$r9T$*$&$H$9$kJ}$K8~$1$F=q$+$l$?$b$N$G$9!#(Bdaemontools $B%Q%C%1!<%8$N35MW!"F3F~!&@_DjJ}K!!";HMQNc$J$I$r$^$H$a$F$$$^$9!#$7$+$7!"3F%D!<%k$r>\:Y$K@bL@$9$k$b$N$G$O$"$j$^$;$s!#$=$N$?$a!"$3$NJ8=q$rFI$s$@8e$K!"(B$B%^%K%e%"%k(B*1 $B$rFI$s$G$/$@$5$$!#(B$BF|K\8lLu(B*2$B$b$"$j$^$9!#(B $B$^$?!"?7;3$5$s$N(B daemontools FAQ*3$B$b$"$j$^$9$N$G$=$A$i$b$4Mw2<$5$$!#(B

$BCp5-(B


$BL\


1. $B35MW(B

1.1. daemontools $B$H$O(B

daemontools $B$O%5!<%S%9$r0BA4!&3N


1.2. $B%Q%C%1!<%8$NFbMF(B

daemontools $B%Q%C%1!<%8$K4^$^$l$F$$$k%W%m%0%i%`$K$O

$B%W%m%0%i%`L>(B $B@bL@(B
supervise $B%5!<%S%9$r3+;O$5$;!"4F;k$7$^$9!#2?$i$+$N%H%i%V%k$G%5!<%S%9$,Dd;_$7$?$i!"<+F0E*$K:F5/F0$5$;$^$9!#(B
svc supervise $B$K$h$j4F;k$5$l$F$$$k%5!<%S%9$r@)8f$7$^$9!#(B
svok supervise $B$,5/F0$7$F$$$k$+$rD4$Y$^$9!#(B
svstat supervise $B$K$h$j4F;k$5$l$F$$$k%5!<%S%9$N>uBV$r=PNO$7$^$9!#(B
svscan $B%5!<%S%9$N=8$^$j$r3+;O$5$;!"4F;k$7$^$9!#(B
fghack $B<+?.$r%P%C%/%0%i%s%I$K0\$9%5!<%S%9$,%P%C%/%0%i%s%I$K0\$k$N$rKI$0%D!<%k$G$9!#(B
multilog $BI8=`F~NO$+$i0lB3$-$N9T$rFI$_!"G$0U$N?t$N%m%0$KA*Br$5$l$?9T$rDI2C$7$^$9!#(B
tai64n $B3F9T$K(B TAI64N $B7A<0$N@53N$J%?%$%`%9%?%s%W$r$rIU$1$^$9!#(B
tai64nlocal TAI64N $B7A<0$N%?%$%`%9%?%s%W$r?M$,FI$a$k7A<0$KJQ49$7$^$9!#(B
setuidgid $B;XDj$5$l$?%"%+%&%s%H$N(B uid $B$H(B gid $B$GJL$N%W%m%0%i%`$r5/F0$7$^$9!#(B
envuidgid $B;XDj$5$l$?%"%+%&%s%H$N(B uid $B$H(B gid $B$r<($94D6-JQ?t$r@_Dj$7$FJL$N%W%m%0%i%`$r5/F0$5$;$^$9!#(B
envdir $B;XDj$7$?%G%#%l%/%H%j$K$"$k%U%!%$%k$K$h$C$F=$@5$5$l$?4D6-$r@_Dj$7$FJL$N%W%m%0%i%`$r5/F0$5$;$^$9!#(B
softlimit $B?7$7$$;q8;@)8B$rH<$C$FJL$N%W%m%0%i%`$r5/F0$5$;$^$9!#(B
setlock $B%U%!%$%k$r%m%C%/$7$FJL$N%W%m%0%i%`$r5/F0$5$;$^$9!#(B

1.3. $B4{B8$NB>$N%W%m%0%i%`$H$N0c$$(B

$B4{B8$NB>$N%W%m%0%i%`$H$K0c$$$O


2. $B%$%s%9%H!<%k(B

2.1. daemontools $B$N%$%s%9%H!<%k(B

daemontools $B$N%Q%C%1!<%8(B daemontools-0.70.tar.gz $B$rF~

$B%U%!%$%k$rE83+$7!"$=$N%G%#%l%/%H%j$K0\F0$7$^$9!#(B

$ gzip -dc daemontools-0.70.tar.gz | tar xvf -
$ cd daemontools-0.70

$B%3%s%Q%$%k$7$F!"%$%s%9%H!<%k$7$^$9!#(B

$ make
# make setup check

$B;n83$r9T$$$^$9!#2?$b=PNO$7$J$+$C$?$i@5>o$G$9!#(B

$ ./rts > rts.out
$ cmp rts.out rts.exp

$B%?%$%`%9%?%s%W$r3NG'$7$^$9!#3F9T$NA0$NF|;~$H8e$m$NF|;~$OF1$8$K$J$j$^$9!#$?$@$7!"C

$ date | ./tai64n | ./tai64nlocal
2000-05-05 11:16:53.959932500 Fri May 5 11:16:53 JST 2000
$ date | sh -c './multilog t e 2>&1' | ./tai64nlocal
2000-05-05 11:17:11.739003500 Fri May 5 11:17:11 JST 2000

$B0J>e!"2?$bLdBj$,@8$8$J$1$l$P!"%$%s%9%H!<%k$O=*N;$G$9!#(B

$B4XO"%j%s%/(B


2.2. svscan $B$N5/F0(B

svscan $B$,4F;k$9$k%G%#%l%/%H%j$r:n@.$7$^$9!#(Bsvscan $B$K4X$9$k@bL@$OO$G9T$$$^$9!#(B

# mkdir /service
# chmod 755 /service

$B%V!<%H%9%/%j%W%H$K(B svscan $B$r5/F0$9$k%3%^%s%I$rEPO?$7$^$9!#(BBSD $B7A<0$N5/F0%9%/%j%W%H$G$"$l$P!"(Brc.local $B$J$I$K!"PATH $B$OI,MW$@$H;W$&$b$N$r@_Dj$7$F$/$@$5$$!#(B

env - PATH=/usr/local/bin:/usr/bin:/bin csh -cf 'svscan /service &'

SVR4 $B7A<0$N5/F0%9%/%j%W%H$G$"$l$P!"svscan $B$r:n@.$7!"EPO?$7$F$/$@$5$$!#(BOS $B$K$h$j>/!9=$@5$9$kI,MW$,$"$k$H;W$$$^$9!#(B


#!/bin/sh
PATH=/usr/local/bin:/usr/bin:/bin

case "$1" in
  start)
        echo -n "Starting svscan: "
        exec env - PATH="$PATH" \
        csh -cf 'svscan /service &; echo $! > /var/run/svscan.pid'
        touch /var/lock/subsys/svscan
        ;;
  stop)
        if [ -f /var/run/svscan.pid ]; then
          echo -n "Stopping svscan: "
          kill `cat /var/run/svscan.pid`
          svc -dx /service/*
          svc -dx /service/*/log
          rm -f /var/run/svscan.pid
          rm -f /var/lock/subsys/svscan
        fi
        ;;
  *)
        echo "Usage: $0 {start|stop}"
        exit 1
esac

exit 0

$B$J$*!"(BRedHat Linux 7.x$BMQ$N5/F0%9%/%j%W%H$O(B http://www.emaillab.org/djb/daemontools/svscan $B$K$"$j$^$9!#

# cd /etc/rc.d/init.d
# cp /tmp/svscan .
# chmod +x svscan
# chkconfig --add svscan

$B5/F0%9%/%j%W%H$NEPO?$,$G$-$?$i!"5/F0%9%/%j%W%H$r8DJL$Ksvscan $B$r5/F0$7$F$/$@$5$$!#(B

$B4XO"%j%s%/(B


3. $B%5!<%S%9$N@)8f(B

3.1. svscan $B$H(B supervise $B$NF0:n(B

svscan $B$O4F;kBP>]$N%G%#%l%/%H%j(B /service $B$K%5%V%G%#%l%/%H%j(B sub $B$,$"$k$H$-!"$=$N%G%#%l%/%H%jL>$r0z?t$K$7$F(B supervise $B$r5/F0$5$;$^$9!#(Bsupervise $B$O0z?t$GEO$5$l$?%G%#%l%/%H%j(B sub $B$K0\F0$7!"(B./run $B%9%/%j%W%H$r5/F0$5$;!"4F;k$7$^$9!#$3$N(B ./run $B$K$O%5!<%S%9$rsub $B$K(B sticky bit $B$,N)$C$F$$$l$P!"(Bsvscan $B$O(B sub $B$K0\F0$7!"(Blog $B$r0z?t$K$7$F(B supervise $B$r5/F0$5$;!"(Bsub/run $B$N=PNO$H(B sub/log/run $B$NF~NO$r%Q%$%W$G$D$J$.$^$9!#$3$N$H$-$N(B supervise $B$O0z?t$GEO$5$l$?%G%#%l%/%H%j(B log $B$K0\F0$7!"(B./run $B%9%/%j%W%H$r5/F0$5$;!"4F;k$7$^$9!#$3$N(B ./run $B$K$O%m%0$r5-O?$9$k%W%m%0%i%`(B(multilog)$B$rsupervise $B$O(B svscan $B$K$h$j5/F0$5$;$i$l$k$N$G!"%9%/%j%W%HCf$K(B supervise $B$rL@<($7$F5-=R$9$kI,MW$O$"$j$^$;$s!#(B $B$=$l$>$l$N%W%m%0%i%`$H$=$N0z?t$*$h$S:n6H$9$k%G%#%l%/%H%j$r@0M}$9$k$H

$B%W%m%0%i%`(B $B:n6H%G%#%l%/%H%j(B
svscan /service /service
supervise sub /service/sub
supervise log /service/sub/log

$B>e5-$G=R$Y$?$3$H$K2C$($F!"(Bsvscan $B$K$O

$B>e5-$G=R$Y$?$3$H$K2C$($F!"(Bsupervise $B$K$O

$B4XO"%j%s%/(B


3.2. $B3F%5!<%S%9$N5/F0(B

a) $B%m%0$rl9g(B

$B5/F0$5$;$?$$%5!<%S%9$N$?$a$N%G%#%l%/%H%j(B/path/to/foo$B$rE,Ev$J>l=j$K:n@.$7$^$9!#(B

# mkdir /path/to/foo

$B./run $B$r:n@.$7!"%5!<%S%9$r

/service/sub $B$+$i(B /path/to/foo $B$X$N%7%s%\%j%C%/%j%s%/$r:n$j$^$9!#(B

# ln -s /path/to/foo /service/sub

5$BIC0JFb$K(B supervise $B$,5/F0$9$k$G$7$g$&!#(Bsvok $B$r;H$C$F5/F0$,@.8y$7$F$$$k$+3NG'$G$-$^$9!#$^$?!"(Bsvstat $B$G$b$=$N5/F0$N>uBV$r3NG'$G$-$^$9!#(B

# svok /service/sub; echo "$?"
0
# svstat /service/sub
/service/sub: up (pid 1234) 20 seconds

b) $B%m%0$rl9g(B

$B5/F0$5$;$?$$%5!<%S%9$N$?$a$N%G%#%l%/%H%j(B/path/to/foo$B$rE,Ev$J>l=j$K:n@.$7$^$9!#%m%0MQ$N%G%#%l%/%H%j(B /path/to/foo/log $B$b:n@.$7$^$9!#$5$i$K(B foo $B$KBP$7$F(B sticky bit $B$rN)$F$^$9!#%m%0$N=PNO$r9T$&(B UID, GID $B$rJQ$($k>l9g$O!"(Blog $B$N=jM-

# mkdir /path/to/foo
# mkdir /path/to/foo/log
# chmod +t /path/to/foo
# chown uid.gid /path/to/foo/log

$B./run $B$r:n@.$7!"%5!<%S%9$rlog/run $B$r:n@.$7!"%m%0$rJ]B8$9$k%9%/%j%W%H$r5-=R$7$^$9!#(B

/service/sub $B$+$i(B /path/to/foo $B$X$N%7%s%\%j%C%/%j%s%/$r:n$j$^$9!#(B

# ln -s /path/to/foo /service/sub

5$BIC0JFb$K(B supervise $B$,5/F0$9$k$G$7$g$&!#(Bsvok $B$r;H$C$F5/F0$,@.8y$7$F$$$k$+3NG'$G$-$^$9!#$^$?!"(Bsvstat $B$G$b$=$N5/F0$N>uBV$r3NG'$G$-$^$9!#(B

# svok /service/sub; echo "$?"
0
# svok /service/sub/log; echo "$?"
0
# svstat /service/sub /service/sub/log
/service/sub: up (pid 1234) 20 seconds
/service/sub/log: up (pid 1235) 20 seconds

$B6qBNNc(B(qmail$B$N>l9g(B)

$B$^$:!"(Bqmail $B$N5/F0%W%m%0%i%`(B qmail-start $BMQ$N%G%#%l%/%H%j$r:n@.$7$^$9!#>l=j$O$I$3$G$b$+$^$$$^$;$s$,!"$3$3$G$O(B /var/qmail/supurvise/qmail-send $B$H$7$^$9!#%m%0$rJ]B8$9$k$?$a$K!"$3$N%G%#%l%/%H%j$K(B sticky bit $B$rN)$F!"$=$N%G%#%l%/%H%j$N2<$K$K(B qmail-send $B$N%m%0J]B8MQ%f!<%6(B qmaill $B=jM-$N%G%#%l%/%H%j(B log $B$r:n@.$7$^$9!#(B

# mkdir /var/qmail/supervise/qmail-send
# chmod +t /var/qmail/supervise/qmail-send
# mkdir /var/qmail/supervise/qmail-send/log
# chown qmaill.nofiles /var/qmail/supervise/qmail-send/log

$B5/F0%9%/%j%W%H(B ./run $B$H(B log/run $B$r:n@.$7$^$9!#$3$N%9%/%j%W%H$NNc$O

/service/qmail $B$+$i$N%7%s%\%j%C%/%j%s%/$r:n$j$^$9!#(B

# ln -s /var/qmail/supervise/qmail-send /service/qmail

5$BIC0JFb$K(B supervise $B$,5/F0$9$k$O$:$J$N$G!"(Bsvok $B$"$k$$$O(B svstat $B$G5/F0$r3NG'$7$F$/$@$5$$!#$^$?!"(Bqmail $B$N%^%K%e%"%k$K5-=R$7$F$"$kG[Aw;n83$r9T$C$F$/$@$5$$!#(B

$Bqmail-smtpd $BMQ$N%G%#%l%/%H%j$r:n@.$7$^$9!#$3$3$G$O(B /var/qmail/supervise/qmail-smtpd $B$H$7$^$9!#%m%0$rJ]B8$9$k$?$a$K!"$3$N%G%#%l%/%H%j$K(B sticky bit $B$rN)$F!"$=$N%G%#%l%/%H%j$N2<$K$K(B qmail-send $B$N%m%0J]B8MQ%f!<%6(B smtplog $B=jM-$N%G%#%l%/%H%j(B log $B$r:n@.$7$^$9!#(B

# mkdir /var/qmail/supervise/qmail-smtpd
# chmod +t /var/qmail/supervise/qmail-smtpd
# mkdir /var/qmail/supervise/qmail-smtpd/log
# chown smtplog.nofiles /var/qmail/supervise/qmail-smtpd/log

$B5/F0%9%/%j%W%H(B ./run $B$H(B log/run $B$r:n@.$7$^$9!#$3$N%9%/%j%W%H$NNc$O

/service/smtpd $B$+$i$N%7%s%\%j%C%/%j%s%/$r:n$j$^$9!#(B

# ln -s /var/qmail/supervise/qmail-smtpd /service/smtpd

5$BIC0JFb$K(B supervise $B$,5/F0$9$k$O$:$J$N$G!"(Bsvok $B$"$k$$$O(B svstat $B$G5/F0$r3NG'$7$F$/$@$5$$!#(B

$B4XO"%j%s%/(B


3.3. $B5/F0%9%/%j%W%H(B ./run $B$NNc(B

$B$3$3$G$O!"%5!<%S%9$N5/F0%9%/%j%W%H(B ./run $B$N:[email protected]$r<($7$^$9!#%m%0$N<}=8%9%/%j%W%H(B log/run $B$K4X$7$F$O$3$3$G$OE57?E*$JNc$7$+<($7$^$;$s!#1~MQNc$OO$K5-=R$7$^$9!#(B

./run $B$r:n@.$9$k$KEv$?$C$F$NCm0U;v9`(B

qmail-send

qmail $B$N%a%$%kG[Aw$N%W%m%0%i%`$r5/F0$5$;!"G[Aw$N%m%0$rl9g$NNc$r<($7$^$9!#%m%0$O(B qmail-send $B$N%m%0J]B8@lMQ$N%f!<%6(B qmaill $B$K$h$jJ]B8$5$l$^$9!#$9$Y$F$N%m%0$O%?%$%`%9%?%s%W$rIU$1$F(B ./log/main/ $B$KJ]B8$5$l$^$9!#$5$i$K8=:_$N@\B3?t$O(B ./log/status $B$KJ]B8$5$l$^$9!#(B

./run

#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir/

./log/run

#!/bin/sh
exec \
setuidgid qmaill \
multilog t ./main '-*' '+* status: *' =status

qmail-smtpd

qmail $B$N(B SMTP $B%G!<%b%s(B qmail-smtpd $B$r(B tcpserver $B$G5/F0$5$;$F@\B3@)8f$r9T$$!"@\B3>u67$N%m%0$rl9g$NNc$r<($7$^$9!#$3$N>l9g$O%m%0J]B8@lMQ$N%f!<%6(B smtplog $B$K$h$j%m%0$rJ]B8$7$^$9!#$^$?!"@\B3@)8f%U%!%$%k(B tcp.cdb $B$OF1$8%G%#%l%/%H%j$K$"$k$b$N$H$7$^$9!#(B

./run

#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
tcpserver -vR -c40 -x./tcp.cdb -u7791 -g2108 0 smtp qmail-smtpd 2>&1

./log/run

#!/bin/sh
exec \
setuidgid smtplog \
multilog t ./main '-*' '+* * status: *' =status

$B4XO"%j%s%/(B


3.4. $B%5!<%S%9$N@)8f(B

svc $B$r;H$C$F

svc $B$N;H$$J}$O

svc opts services

opts $B$O(B getopt $B7A<0$N%*%W%7%g%s$G$9!#J#?t$N%*%W%7%g%s$r;XDj$G$-!"A0$+$i=gHV$Kservices $B$O@)8fBP>]$N%G%#%l%/%H%jL>$G$9!#J#?t$N%G%#%l%/%H%j$rF1;~$K;XDj$G$-$^$9!#$3$3$G!"(Bsvc $B$N%*%W%7%g%s$N0lMw$r<($7$^$9!#(B

$B%*%W%7%g%s(B $B0UL#(B $BF0:n(B
-u Up $B%5!<%S%9$,5/F0$7$F$$$J$1$l$P!"3+;O$7$^$9!#%5!<%S%9$,Dd;_$7$F$$$l$P!":F3+$7$^$9!#(B
-d Down $B%5!<%S%9$,5/F0$7$F$$$l$P!"(BTERM $B%7%0%J%k$rAw$j!"$=$l$+$i(B CONT $B%7%0%J%k$rAw$j$^$9!#Dd;_$7$?8e$O:F3+$7$^$;$s!#(B
-o Once $B%5!<%S%9$,5/F0$7$F$$$J$1$l$P!"3+;O$7$^$9!#%5!<%S%9$,Dd;_$7$F$$$l$P!":F3+$7$^$;$s!#(B
-p Pause $B%5!<%S%9$K(B STOP $B%7%0%J%k$rAw$j$^$9!#(B
-c Continue $B%5!<%S%9$K(B CONT $B%7%0%J%k$rAw$j$^$9!#(B
-h Hangup $B%5!<%S%9$K(B HUP $B%7%0%J%k$rAw$j$^$9!#(B
-a Alarm $B%5!<%S%9$K(B ALRM $B%7%0%J%k$rAw$j$^$9!#(B
-i Interrupt $B%5!<%S%9$K(B INT $B%7%0%J%k$rAw$j$^$9!#(B
-t Terminate $B%5!<%S%9$K(B TERM $B%7%0%J%k$rAw$j$^$9!#(B
-k Kill $B%5!<%S%9$K(B KILL $B%7%0%J%k$rAw$j$^$9!#(B
-x Exit $B%5!<%S%9$,%@%&%s$7$?$i$9$0$K(B supervise $B$O=*N;$7$^$9!#(B

$B%7%0%J%k$N0UL#$O\:Y$O(B signal(7) $B$rFI$s$G$/$@$5$$!#(B

$B%7%0%J%k(B $BCM(B $B0UL#(B
SIGSTOP 17 $B%W%m%;%9$NDd;_(B
SIGCONT 19 $BDd;_>uBV$+$i$N:F3+(B
SIGHUP 1 $B@)8f$7$F$$$kC
SIGALRM 14 alarm(2)$B$+$i$N%?%$%^!<%7%0%J%k(B
SIGINT 2 $B%-!<%\!<%I$+$i$N3d$j9~$_(B
SIGTERM 15 $B=*N;%7%0%J%k(B
SIGKILL 9 Kill$B%7%0%J%k(B

$B$3$3$G!"$$$/$D$+$N;HMQNc$r<($7$^$9!#(B

qmail-send $B$N@_Dj$NJQ99$rM-8z$K$9$k$?$a$N%5!<%S%9$N:F5/F0(B

# svc -t /service/qmail

./run $B$N=q$-49$(;~$N=hM}(B

# mv ./run.new ./run; svc -t /service/smtpd

$B%5!<%S%9$N0l;~E*$JDd;_$*$h$S:F3+(B

# svc -d /service/ftpd
# svc -u /service/ftpd

$B%5!<%S%9$NDd;_8e!"(Bsupervise $B$N=*N;!J$?$@$7!"(B5$BIC0JFb$K(B supervise $B$O:F5/F0$9$k!K(B

# svc -dx /service/ftpd /service/ftpd/log

$B%5!<%S%9$NDd;_8e!"(Bsupervise $B$N=*N;!J(Bsupervise $B$r:F3+$5$;$J$$!K(B

# mv /service/ftpd /service/.ftpd; svc -dx /service/.ftpd /service/.ftpd/log

svscan$B$r=*N;$5$;$k$H$-!JA4$F$N%5!<%S%9$NDd;_8e!"(Bsupervise $B$r=*N;$7!"(Bsvscan $B$N%W%m%;%9$r=*N;$9$k!K(B

# svc -dx /service/*
# svc -dx /service/*/log
# kill pid_of_svscan

$B4XO"%j%s%/(B


4. $B%m%0$N<}=8(B

4.1. multilog

$BA0>O$G=R$Y$?%m%0$N<}=8%9%/%j%W%H(B log/run $B$K$O<}=8%W%m%0%i%`$H$7$F(B multilog $B$r;H$$$^$9!#$3$3$G$O!"$=$N(B multilog $B$N;H$$J}$K$D$$$F@bL@$7$^$9!#(B

multilog $B$N;H$$J}$O

multilog script

script $B$OF0:n(B(action)$B$N=8$^$j$G!"

$BF0:n$N35MW(B $BF0:n(B $BHw9M(B
$B%?%$%`%9%?%s%W(B t $B3F9T$N@hF,$K(BTAI64N$B7A<0$N%?%$%`%9%?%s%W$rIU$1$k!#(B($B:G=i$NF0:n$H$7$F5-=R$7$?>l9g$N$_M-8z(B)
$B9T$NA*Br(B -pattern pattern $B$,9T$K9g$($P$=$N9T$NA*Br$,2r=|$5$l$k!#(B
+pattern pattern $B$,9T$K9g$($P$=$N9T$OA*Br$5$l$k!#(B
$B<+F0@Z$jBX$($NF0:n(B ssize $B:GBg%U%!%$%k%5%$%:$N@_Dj!#%G%U%)%k%H(B99999$B!#(B
nnum $B%m%0%U%!%$%k$N:GBg?t!#%G%U%)%k%H(B10$B!#(B
!processor $B%W%m%;%C%5$N@_Dj(B
$B%m%0(B dir $B%m%0(B dir $B$XA*Br$5$l$?9T$rDI2C$9$k!#%I%C%H$d%9%i%C%7%e$G;O$^$kI,MW$,$"$k!#(B
$B7Y9p(B e $BI8=`%(%i!<$KA*Br$5$l$?3F9T!J$N:G=i$N(B200$B%P%$%H!K$r=PNO$9$k!#(B
Status$B%U%!%$%k(B =file file $B$NCf?H$rA*Br$5$l$?3F9T!J$N:G=i$N(B1000$B%P%$%H!K$GCV$-49$($k!#(B

$B3F9T$O:G=i$OA*Br$5$l$F$$$^$9!#9T$NA*Br;XDj$O$$$/$D$G$b5-=R$G$-!"A0$+$i=gHV$K$=$N%Q%?!<%s$NA*Br!&2r=|$,DI2C$5$l$F$$$-$^$9!#(B

pattern$B$N;EMM$O

$BA[Dj30$NF0:n$rKI$0$?$a$K!"(Bpattern$BA4BN$r0zMQId$G0O$s$@J}$,L5Fq$G$7$g$&!#(B

$B$3$3$G!"$$$/$D$+9T$NA*Br;XDj$NNc$r<($7$^$9!#(Bmultilog $B$N>\$7$$;HMQNc$K4X$7$F$O

$BF0:n(B
+hello $B$O(B hello $B$rA*Br$7$^$9!#(Bhello world $B$OA*Br$7$^$;$s!#(B

$BF0:n(B
-'* * > *' $B$O(B
@400000003879ded713291cfc 4357 > -ERR authorization failed $B$NA*Br$r2r=|$7$^$9!#0l$DL\$HFs$DL\$N(B * $B$O$=$ND>8e$N%9%Z!<%9$r4^$^$J$$G$0U$NJ8;zNs$K0lCW$7$^$9!#(B

$BF0:n(B
'-*' $B$OA4$F$N9T$NA*Br$r2r=|$7$^$9!#FCDj$N%Q%?!<%s$N$_$rA*Br$9$k>l9g$ODL>o!":G=i$K$3$NF0:n$r5-=R$7$FA4$F$NA*Br$r2r=|$7$F$+$i!"A*Br$9$k%Q%?!<%s$rDI2C$7$F$$$-$^$9!#(B

$B0lB3$-$NF0:n(B
-'*' +'* status: *' =status $B$O(B
@400000003914053c22ab2904 status: local 0/10 remote 0/20 $B$rA*Br$7!"(Bstatus $B$H$$$&%U%!%$%k$NFbMF$rCV$-49$($^$9!#$D$^$j!"(Bstatus $B$H$$$&%U%!%$%k$K$O>o$K:G?7$N(B status: $B9T$,3JG<$5$l$k$3$H$K$J$j$^$9!#(B

$B4XO"%j%s%/(B


4.2. .log/run $B$N:[email protected](B

qmail-send

qmail $B$N%a%$%kG[Aw%W%m%0%i%`(B qmail-send $B$N%m%0$rl9g$NNc$r<($7$^$9!#%m%0$O(B qmail-send $B$N%m%0J]B8@lMQ$N%f!<%6(B qmaill $B$K$h$jJ]B8$5$l$^$9!#$3$N%9%/%j%W%H$O

$B$A$J$_$K!"$3$NNc$O(B DJB $B;a$,%a%$%j%s%0%j%9%H$KEj9F$7$?Nc$r=$@5$7$?$b$N$G$9!#(B

#!/bin/sh
exec \
setuidgid qmaill \
multilog t ./main \
-'* status: *' \
-'* starting delivery *' \
-'* delivery * success*' \
-'* delivery * failure*' \
-'* new msg *' \
-'* info msg *' \
-'* end msg *' \
-'* bounce msg *' \
-"* delivery * deferral: Sorry,_I_couldn't_find_any_host_by_that_name*" \
-"* delivery * deferral: Sorry,_I_wasn't_able_to_establish_an_SMTP_*" \
./alert \
-'*' \
+'* status: *' \
=status

qmail-smtpd

qmail $B$N(B SMTP $B%G!<%b%s(B qmail-smtpd $B$rESCf$r(B recordio $B$r64$s$G(B tcpserver $B$G5/F0$5$;$F@\B3@)8f$r9T$$!"@\B3>u67$N%m%0$H%3%^%s%I$N1~Ez$rl9g$NNc$r<($7$^$9!#$3$N>l9g$O%m%0J]B8@lMQ$N%f!<%6(B smtplog $B$K$h$j%m%0$rJ]B8$7$^$9!#$3$N%9%/%j%W%H$O

$B$A$J$_$K(B recordio $B$H$O!"%W%m%0%i%`$NF~=PNO$r5-O?$9$k%W%m%0%i%`$G!"(Bucspi-tcp $B%Q%C%1!<%8$K4^$^$l$F$$$^$9!#$3$l$rMQ$$$l$P!"%m%0$N=PNO$r;}$?$J$$%5!<%S%9$G$"$C$F$b!"%;%C%7%g%s$N%3%^%s%I$N1~Ez$+$i!"IT@5Cf7Q$N;n$_$J$I$NMM!9$J>pJs$r5-O?$9$k$3$H$,$G$-$^$9!#$?$@$7!"A*Br$9$k9T$K$h$C$F$O%W%i%$%P%7$NLdBj$K$b$J$k$N$G07$$$K$OCm0U$,I,MW$G$9!#(B

#!/bin/sh
exec \
setuidgid smtplog \
multilog t \
-'* * > *' \
-'* * < *' \
s200000 \
./main \
-'*' \
+'* * < HELO *' \
+'* * < EHLO *' \
+'* * < MAIL *' \
+'* * < RCPT *' \
+'* * < DATA*' \
+'* * < QUIT*' \
+'* * < RSET*' \
+'* * < NOOP*' \
+'* * > 1*' \
+'* * > 2*' \
+'* * > 3*' \
+'* * > 4*' \
+'* * > 5*' \
s200000 \
./tcp \
-'*' \
+'* * status: *' \
=status

$B4XO"%j%s%/(B


5. $B4D6-JQ?t!&;q8;@)8B(B ($B:[email protected]=Dj(B)

$B$3$3$^$G


Thanks to M.Sugimoto.