Stdout / stderr перенаправляет в start-stop-daemon


8

Я пытаюсь написать initконфигурацию, которая перенаправит вывод моего демона в два файла (для stdout и stderr). Проблема в том, что это не работает. Я читаю это прямо сейчас.

Итак, я сделал этот скрипт для проверки этого подхода. И это не работает:

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

Но если вы запустите это без упаковки демона в отдельную оболочку, он будет работать как задумано (только без перенаправлений stderr / stdout):

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

Вопрос в том, почему первый скрипт не работает? Система Debian Lenny, start-stop-daemonверсия 1.14.29

Ответы:


4

Из-за порядка раскрытия вы не можете передавать перенаправления в переменных. Перенаправление оценивается перед разделением слов.

См. BashFAQ / 050 , Расширения и перенаправления оболочки .


Да, просто замените две последние строки на: NCMD = "exec $ DAEMON $ DAEMON_ARGS"; start-stop-daemon -Sbmv --pidfile $ PIDFILE --chdir $ {DAEMON_DIR} --exec $ DAEMON --startas / bin / sh - $ NCMD 1 >> $ APPLOG_FILE 2 >> $ ERRLOG_FILE
BMDan

Будет ли перенаправлять потоки узлов или start-stop-daemon?
Куроки Казе

1
@Kuroki и @BMDan: это перенаправит вывод start-stop-daemon.
Приостановлено до дальнейшего уведомления.

2
Любой способ слушать только для вывода демона (другой из sh обертки)?
Куроки Казе

1

Ваша строка в сценарии:

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

Итак, вы в основном говорите, чтобы exec $DAEMONиспользовал в $NCMDкачестве аргументов. Попробуйте изменить $NCMDна

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

и посмотреть, если это работает.

Если нет, вам придется изменить программное обеспечение для перенаправления stdoutи stderrфайлов (возможно, оно уже имеет опцию регистрации). Вы также можете написать скрипт- обертку просто для перенаправления, но это немного на уродливой стороне.


1

Еще один способ перенаправления потоков с использованием nohup :

nohup ./bin/servicemix ./conf/servicemix.xml > log/nohup.log 2>&1 &
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.