Stdout / stderr chuyển hướng trong start-stop-daemon


8

Tôi đang cố gắng viết initcấu hình sẽ chuyển hướng đầu ra của trình nền của tôi sang hai tệp (cho thiết bị xuất chuẩn và thiết bị xuất chuẩn). Vấn đề là, nó không hoạt động. Tôi đang đọc cái này ngay bây giờ.

Vì vậy, tôi đã thực hiện kịch bản shell này để kiểm tra phương pháp này. Và nó không hoạt động:

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Seed kurokikaze starter"
#NAME=node
DAEMON="/etc/node-version/0.1.99/bin/node"
DAEMON_ARGS="/etc/seed/kurokikaze/server.js"
DAEMON_DIR="/etc/seed/kurokikaze"

APPLOG_FILE="/var/log/seed/kurokikaze"
ERRLOG_FILE="/var/log/seed/kurokikaze-err"

PIDFILE="/var/run/seeds/kurokikaze.pid"
SCRIPTNAME="/etc/seed-init/kurokikaze"

NCMD="exec $DAEMON $DAEMON_ARGS 1>>$APPLOG_FILE 2>>$ERRLOG_FILE"

start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir ${DAEMON_DIR} --exec $DAEMON --startas /bin/sh -- $NCMD

Nhưng nếu bạn bắt đầu điều này mà không bọc daemon trong vỏ riêng biệt, nó sẽ hoạt động như dự định (chỉ không có chuyển hướng stderr / stdout):

start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir ${DAEMON_DIR} --exec $DAEMON -- ${DAEMON_ARGS}

Câu hỏi là: tại sao tập lệnh đầu tiên không hoạt động? Hệ thống là Debian Lenny, start-stop-daemonphiên bản là 1.14,29

Câu trả lời:


4

Do thứ tự mở rộng, bạn không thể chuyển các chuyển hướng trong các biến. Chuyển hướng được đánh giá trước khi tách từ.

Xem BashFAQ / 050 , Mở rộngchuyển hướng Shell .


Đúng, vì vậy chỉ cần thay thế hai dòng cuối cùng bằng: NCMD = "exec $ DAEMON $ DAEMON_ARGS"; start-stop-daemon -Sbmv --pidfile $ PIDFILE --chdir $ {DAEMON_DIR} --exec $ DAEMON --startas / sh - $ NCMD 1 >> $ ỨNG DỤNG 2 >> $ ERRLOG_FILE
BMDan

Nó sẽ chuyển hướng các luồng nút hoặc start-stop-daemoncủa?
Kuroki Kaze

1
@Kuroki và @BMDan: Điều đó sẽ chuyển hướng đầu ra của start-stop-daemon.
Tạm dừng cho đến khi có thông báo mới.

2
Bất kỳ cách nào chỉ nghe cho đầu ra daemon (khác của sh Wrapper)?
Kuroki Kaze

1

Dòng của bạn trong kịch bản là:

start-stop-daemon -Sbmv --pidfile $PIDFILE --chdir ${DAEMON_DIR} --exec $DAEMON --startas /bin/sh -- $NCMD

Vì vậy, về cơ bản bạn đang nói với exec $DAEMONbằng cách sử dụng $NCMDnhư args. Cố gắng thay đổi $NCMDthành

"$DAEMON_ARGS 1>>$APPLOG_FILE 2>>$ERRLOG_FILE"

và xem nếu nó hoạt động.

Nếu không, bạn sẽ phải thay đổi phần mềm của mình để chuyển hướng stdoutstderrsang tệp (có thể phần mềm này đã có tùy chọn ghi nhật ký). Bạn cũng có thể viết một kịch bản trình bao bọc chỉ để thực hiện chuyển hướng nhưng đó là một chút về mặt xấu xí.


1

Một cách khác để chuyển hướng luồng đó bằng cách sử dụng nohup như:

nohup ./bin/servicemix ./conf/servicemix.xml > log/nohup.log 2>&1 &
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.