Estoy usando un script de inicio para ejecutar un proceso simple, que se inicia con:
start-stop-daemon --start --quiet --chuid $DAEMONUSER \
--make-pidfile --pidfile $PIDFILE --background \
--exec $DAEMON $DAEMON_ARGS
El proceso llamado $ DAEMON generalmente imprime información de registro en su salida estándar. Por lo que puedo decir, estos datos no se almacenan en ningún lugar.
Me gustaría escribir o agregar la salida estándar de $ DAEMON a un archivo en algún lugar.
La única solución que conozco es decirle a start-stop-daemon que llame a un shellscript en lugar de $ DAEMON directamente; el script luego llama a $ DAEMON y escribe en el archivo de registro. Pero eso requiere un script adicional que, al igual que modificar el demonio en sí, parece la forma incorrecta de resolver una tarea tan común.
fuente
--start
con--stop
realmente funciona.start-stop-daemon --test (...)
?>>
lugar de>
para añadir.Necesitas hacer:
Además, si usa
--chuid
o--user
, asegúrese de que el usuario pueda escribir en/var/log
el archivo/var/log/some.log
. La mejor manera es que el usuario tenga un/var/log/subdir/
pensamiento.fuente
bashPID=$(cat $PIDFILE); [ -n "$bashPID" ] && pkill -P "$bashPID"
pkill
solución también. Preguntándose qué haría... -c "exec $DAEMON..."
(agregando el "ejecutivo"). No tengo esto en el plato ahora, así que no puedo probarlo.Parece que debería poder usar ahora el
--no-close
parámetro al comenzarstart-stop-daemon
a capturar la salida del demonio. Esta nueva característica está disponible en eldpkg
paquete desde la versión 1.16.5 en Debian:fuente
start-stop-daemon
. Sin embargo, la versión openrc tiene las opciones-1
y-2
para redirigir stdout y stderr respectivamente.Con openrc (que es el predeterminado en gentoo o alpine linux, por ejemplo)
start-stop-daemon
tiene las opciones-1
y-2
:Entonces puedes escribir:
fuente
No es demasiado difícil capturar la salida del demonio y guardarla en un archivo:
Sin embargo, esta solución puede no ser óptima para
logrotate
.Podría ser mejor capturar la salida en syslog. En Debian esto coincidiría con el comportamiento de los servicios systemd. El siguiente intento directo de reescribir el ejemplo anterior es incorrecto porque deja atrás dos procesos sin padres ("zombi") (registrador y demonio) después de detener el demonio porque
start-stop-daemon
termina solo su hijo pero no todos los descendientes:Para que funcione, necesitamos un contenedor que termine sus hijos al recibir
duende :SIGTERM
destart-stop-daemon
. Hay algunos:Nota:
uid=65534
es un usuarionobody
.Ventajas : funciona y es relativamente fácil.
demonio :Contras : 4 procesos (supervisor
duende
, su bifurcación con privilegios eliminados (registrador)su
y el propio demonio); obligatoria--chroot
; Si el demonio termina de inmediato (por ejemplo, un comando no válido),status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
infórmelo como iniciado correctamente.Pros : 3 procesos (supervisor
daemon
,su
y daemon sí mismo).Contras : Difícil de administrar
$PIDFILE
debido a las opciones confusas de la línea de comandos del demonio ; Si el demonio termina de inmediato (por ejemplo, un comando no válido),status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
infórmelo como iniciado correctamente.pipexec ( el ganador ):
Pros : 3 Procesos (supervisor
pipexec
,logger
y Daemon sí mismo); Si el demonio termina de inmediato (por ejemplo, un comando no válido)status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
, informe correctamente el error.Contras : ninguno.
Este es el ganador: la solución más sencilla y ordenada que parece funcionar bien.
fuente
Por lo general,
start-stop-daemon
cierra los descriptores de archivos estándar cuando se ejecuta en segundo plano. Desde la página de manual destart-stop-daemon
:Este funcionó para mí:
fuente
Citando una vieja lista de correo:
https://lists.ubuntu.com/archives/ubuntu-uk/2005-June/000037.html
fuente
No estoy seguro de si "$ DAEMON $ DAEMON_ARGS> /var/log/some.log 2> & 1" alguna vez cerrará el descriptor de archivo para el archivo de registro ... lo que significa que si su demonio se ejecuta para siempre, no estoy seguro que logrotate u otros mecanismos para limpiar el espacio en disco funcionarían. Dado que es> en lugar de >>, el comando sugerido también truncaría los registros existentes al reiniciar. Si desea ver por qué se bloqueó el demonio y se reinicia automáticamente, puede que no sea de mucha ayuda.
Otra opción podría ser "$ DAEMON | logger". logger es un comando que se registrará en syslog (/ var / log / messages). Si también necesita stderr, creo que podría usar "$ DAEMON 1> & 2 | logger"
fuente
>>
es generalmente más apropiado para demonios, ¡aunque implica que ahora debería crear una regla de logrotate!--no-close ... | logger
no me funciona (Debian 7.3, start-stop-daemon 1.16.12). El script start-stop-daemon no regresa, aunque / var / log / messages está lleno :-). Lo probé con y sin1>&2
.Suponiendo que es bash (aunque algunos otros shells también pueden permitir esto), la línea:
enviará toda la salida estándar futura a ese archivo. Eso es porque
exec
sin un nombre de programa solo hace algo de magia de redirección. Desde labash
página del manual:La gestión de dicho expediente es, por supuesto, otro tema.
fuente
start-stop-daemon
línea que mencionó la pregunta inicial?Qué tal si:
fuente