Arka planın çıktısını yakalamak ve bir dosyaya kaydetmek çok zor değildir:
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas $DAEMON --no-close \
-- $DAEMON_ARGS >> $LOGFILE 2>&1
Ancak bu çözüm yetersiz olabilir logrotate
.
Syslog'a çıktı almak daha iyi olabilir. On Debian bu systemd hizmetlerin davranışını eşleşir. Yukarıdaki örneği yeniden yazmak için yapılan aşağıdaki doğrudan girişim yanlıştır çünkü arka plan programı durdurulduktan sonra ardında iki ebeveyn olmayan ("zombi") işlemi (günlükçü ve arka plan programı) bırakır, çünkü start-stop-daemon
yalnızca alt öğelerini sonlandırır, ancak tüm soyundan gelenleri değil:
## 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"""
Çalışmasını sağlamak için, çocuklarını alınınca sonlandıran bir paketleyiciye ihtiyacımız var SIGTERM
.start-stop-daemon
. Biraz var:
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"""
Not: uid=65534
bir kullanıcıdırnobody
.
Artıları : işe yarıyor ve nispeten kolay.
Eksileri : 4 işlem (süpervizör duende
, bırakılan ayrıcalıklara sahip çatalı (logger) su
ve arka plan programının kendisi); zorunlu --chroot
; Arka plan programı hemen sona ererse (örneğin geçersiz komut)status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
, başarıyla başlatıldığını bildirin.
arka plan programı :
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"""
Avantaj : 3 işlemleri (danışman daemon
, su
ve kendisi programı).
Eksileri : Arka plan programının komut satırı seçeneklerinin $PIDFILE
kafa karıştırıcı olması nedeniyle yönetilmesi zordur ; Arka plan programı hemen sona ererse (örneğin geçersiz komut)status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
, başarıyla başlatıldığını bildirin.
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}'
Avantaj : 3 işlemleri (danışman pipexec
, logger
ve kendisi programı); Arka plan programı hemen sonlanırsa (örn. Geçersiz komut), status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
hatayı doğru şekilde bildirin.
Eksileri : yok.
Bu kazanan - iyi çalışıyor gibi görünen en kolay, temiz çözüm.
--start
ile değiştirerek daemon'u tekrar kapatmaktır--stop
.