Stdout / stderr pengalihan di start-stop-daemon

8

Saya mencoba menulis initconfig yang akan mengarahkan output daemon saya ke dua file (untuk stdout dan stderr). Masalahnya, itu tidak berfungsi. Saya membaca ini sekarang.

Jadi, saya sudah melakukan skrip shell ini untuk menguji pendekatan ini. Dan itu tidak berfungsi:

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

Tetapi jika Anda memulai ini tanpa membungkus daemon di shell terpisah, itu berfungsi seperti yang dimaksudkan (hanya tanpa pengalihan stderr / stdout):

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

Pertanyaannya adalah: mengapa skrip pertama tidak berfungsi? Sistem adalah Debian Lenny, start-stop-daemonversi 1.14.29

Kuroki Kaze
sumber

Jawaban:

4

Karena urutan ekspansi, Anda tidak dapat melewati pengalihan dalam variabel. Pengalihan dievaluasi sebelum pemisahan kata.

Lihat BashFAQ / 050 , Ekspansi dan Pengalihan Shell .

Dijeda sampai pemberitahuan lebih lanjut.
sumber
Yap, jadi ganti saja dua baris terakhir dengan: 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
Apakah ini akan mengarahkan aliran node atau start-stop-daemon?
Kuroki Kaze
1
@Kuroki dan @BMDan: Itu akan mengarahkan output start-stop-daemon.
Dijeda sampai pemberitahuan lebih lanjut.
2
Adakah cara untuk mendengarkan hanya untuk keluaran daemon (selain sh wrapper)?
Kuroki Kaze
1

Baris Anda dalam skrip adalah:

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

Jadi pada dasarnya Anda mengatakan kepada exec $DAEMONmenggunakan $NCMDsebagai args. Coba ubah $NCMDke

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

dan lihat apakah itu berfungsi.

Jika tidak, Anda harus mengubah perangkat lunak Anda untuk mengarahkan stdoutdan stderrke file (mungkin itu sudah memiliki opsi logging). Anda juga dapat menulis skrip pembungkus hanya untuk melakukan pengalihan tetapi itu sedikit di sisi yang jelek.

coredump
sumber
1

Cara lain untuk itu streaming redirection menggunakan nohup seperti:

nohup ./bin/servicemix ./conf/servicemix.xml > log/nohup.log 2>&1 &
zaletniy
sumber