Không quá khó để nắm bắt đầu ra của daemon và lưu nó vào tệp:
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas $DAEMON --no-close \
-- $DAEMON_ARGS >> $LOGFILE 2>&1
Tuy nhiên giải pháp này có thể không tối ưu cho logrotate.
Có thể tốt hơn nếu ghi đầu ra vào nhật ký hệ thống. Trên Debian, điều này sẽ phù hợp với hành vi của các dịch vụ systemd. Nỗ lực đơn giản sau đây để viết lại ví dụ trên là sai vì nó để lại hai tiến trình không cha mẹ ("zombie") (trình ghi và daemon) sau khi dừng daemon vì start-stop-daemonchỉ chấm dứt con của nó chứ không phải tất cả con cháu:
## 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"""
Để làm cho nó hoạt động, chúng tôi cần một trình bao bọc kết thúc các con của nó khi nhận được SIGTERMtừstart-stop-daemon . Có vài:
donde :
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"""
Lưu ý: uid=65534là một người dùng nobody.
Ưu điểm : nó hoạt động và tương đối dễ dàng.
Nhược điểm : 4 quy trình (trình giám sát duende, fork của nó với các đặc quyền bị giảm (trình ghi nhật ký), suvà chính daemon); bắt buộc --chroot; Nếu daemon kết thúc ngay lập tức (ví dụ: lệnh không hợp lệ), hãy status_of_proc -p $PIDFILE "$DAEMON" "$NAME"báo cáo là đã bắt đầu thành công.
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"""
Ưu điểm : 3 quá trình (giám sát daemon, suvà daemon chính nó).
Nhược điểm : Khó quản lý $PIDFILEdo các tùy chọn dòng lệnh của daemon khó hiểu ; Nếu daemon kết thúc ngay lập tức (ví dụ: lệnh không hợp lệ), hãy status_of_proc -p $PIDFILE "$DAEMON" "$NAME"báo cáo là đã bắt đầu thành công.
pipexec ( người chiến thắng ):
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}'
Ưu điểm : 3 quá trình (giám sát pipexec, loggervà daemon bản thân); Nếu daemon kết thúc ngay lập tức (ví dụ: lệnh không hợp lệ) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"báo cáo chính xác lỗi.
Nhược điểm : không có.
Đây là giải pháp chiến thắng - giải pháp dễ dàng, dễ dàng nhất và dường như đang hoạt động tốt.
--startbằng--stopcác hoạt động thực sự.