デーモンの出力をキャプチャしてファイルに保存することはそれほど難しくありません。
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas $DAEMON --no-close \
-- $DAEMON_ARGS >> $LOGFILE 2>&1
ただし、このソリューションはでは最適ではない可能性がありますlogrotate
。
出力をsyslogにキャプチャする方がよい場合があります。上のDebianこれはsystemdにサービスの動作と一致します。次の簡単な上記の例を書き直そうとすると、デーモンだけが終了し、すべての子孫が終了するわけではないため、デーモンを停止した後、2つの親なし(「ゾンビ」)プロセス(ロガーとデーモン)が残るため、間違っていますstart-stop-daemon
。
## Do not use this!
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas /bin/sh \
-- -c """exec $DAEMON $DAEMON_ARGS | /usr/bin/logger --tag $NAME"""
これを機能させるには、SIGTERM
からの受信時に子を終了するラッパーが必要start-stop-daemon
です。幾つかある:
duende:
start-stop-daemon --start --background \
--pidfile $PIDFILE \
--startas /usr/sbin/duende \
-- --pid $PIDFILE --chroot=/ --uid 65534 --ident $NAME \
/bin/su --login $DAEMON_USER --shell /bin/sh --command """exec ${DAEMON} $DAEMON_ARGS"""
注:uid=65534
はユーザーnobody
です。
長所:機能し、比較的簡単です。
短所:4つのプロセス(スーパーバイザーduende
、ドロップされた特権を持つそのフォーク(ロガー)、su
およびデーモン自体); 必須--chroot
; デーモンがすぐに終了した場合(無効なコマンドなど)status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
正常に開始されたと報告します。
デーモン:
start-stop-daemon --start --pidfile $PIDFILE \
--startas /usr/bin/daemon \
-- --noconfig --name $NAME --stderr=syslog.info --stdout=syslog.info \
-- /bin/su --login $DAEMON_USER --shell /bin/sh --command """exec $DAEMON $DAEMON_ARGS"""
長所:3つのプロセス(スーパーバイザーdaemon
、su
デーモン自体)。
短所:管理が難しく$PIDFILE
混乱によるデーモンのコマンドラインオプションを、デーモンがすぐに終了した場合(無効なコマンドなど)status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
正常に開始されたと報告します。
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas /usr/bin/pipexec -- -k \
-- [ D $DAEMON $DAEMON_ARGS ] [ L /usr/bin/logger --tag $NAME ] '{D:2>D:1}' '{D:1>L:0}'
長所:3つのプロセス(スーパーバイザーpipexec
、logger
デーモン自体)。デーモンがすぐに終了した場合(無効なコマンドなど)status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
は、失敗を正しく報告します。
短所:なし。
これが勝者です-うまく機能しているように見える最も簡単で、きちんとしたソリューションです。
--start
てデーモンをシャットダウンしても、--stop
実際に機能するためです。