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

Jawaban:


4

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

Lihat BashFAQ / 050 , Ekspansi dan Pengalihan Shell .


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.


1

Cara lain untuk itu streaming redirection menggunakan nohup seperti:

nohup ./bin/servicemix ./conf/servicemix.xml > log/nohup.log 2>&1 &
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.