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-daemon
chỉ 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 SIGTERM
từ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=65534
là 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ý), su
và 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
, su
và daemon chính nó).
Nhược điểm : Khó quản lý $PIDFILE
do 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
, logger
và 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.
--start
bằng--stop
các hoạt động thực sự.