Tidak terlalu sulit untuk menangkap keluaran daemon dan menyimpannya ke file:
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas $DAEMON --no-close \
-- $DAEMON_ARGS >> $LOGFILE 2>&1
Namun solusi ini mungkin kurang optimal logrotate
.
Mungkin lebih baik untuk menangkap keluaran ke syslog. Di Debian, ini akan cocok dengan perilaku layanan systemd. Upaya langsung berikut untuk menulis ulang contoh di atas salah karena meninggalkan dua proses tanpa induk ("zombie") (pencatat dan daemon) setelah menghentikan daemon karena start-stop-daemon
hanya menghentikan anaknya tetapi tidak semua turunannya:
## 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"""
Untuk membuatnya bekerja kita membutuhkan pembungkus yang menghentikan anak-anaknya setelah menerima SIGTERM
dari start-stop-daemon
. Ada beberapa:
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"""
Catatan: uid=65534
adalah pengguna nobody
.
Kelebihan : ini bekerja dan relatif mudah.
Kekurangan : 4 proses (supervisor duende
, forknya dengan hak istimewa yang dijatuhkan (logger), su
dan daemon itu sendiri); wajib --chroot
; Jika daemon langsung berhenti (mis. Perintah tidak valid) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
laporkan sebagai berhasil dimulai.
daemon :
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"""
Kelebihan : 3 proses (supervisor daemon
, su
dan daemon itu sendiri).
Kekurangan : Sulit untuk dikelola $PIDFILE
karena opsi baris perintah daemon yang membingungkan ; Jika daemon langsung berhenti (mis. Perintah tidak valid) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
laporkan sebagai berhasil dimulai.
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}'
Kelebihan : 3 proses (supervisor pipexec
, logger
dan daemon itu sendiri); Jika daemon langsung berhenti (mis. Perintah tidak valid) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
laporkan kegagalan dengan benar.
Kekurangan : tidak ada.
Inilah pemenangnya - solusi termudah dan rapi yang tampaknya berfungsi dengan baik.
--start
dengan--stop
benar - benar berfungsi.