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

--startcon--stoprealmente funciona.start-stop-daemon --test (...)?>>lugar de>para añadir.Necesitas hacer:
Además, si usa
--chuido--user, asegúrese de que el usuario pueda escribir en/var/logel 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"pkillsolució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-closeparámetro al comenzarstart-stop-daemona capturar la salida del demonio. Esta nueva característica está disponible en eldpkgpaquete desde la versión 1.16.5 en Debian:fuente
start-stop-daemon. Sin embargo, la versión openrc tiene las opciones-1y-2para redirigir stdout y stderr respectivamente.Con openrc (que es el predeterminado en gentoo o alpine linux, por ejemplo)
start-stop-daemontiene las opciones-1y-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-daemontermina solo su hijo pero no todos los descendientes:Para que funcione, necesitamos un contenedor que termine sus hijos al recibir
duende :SIGTERMdestart-stop-daemon. Hay algunos:Nota:
uid=65534es un usuarionobody.Ventajas : funciona y es relativamente fácil.
demonio :Contras : 4 procesos (supervisor
duende, su bifurcación con privilegios eliminados (registrador)suy 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,suy daemon sí mismo).Contras : Difícil de administrar
$PIDFILEdebido 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,loggery 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-daemoncierra 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 ... | loggerno 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
execsin un nombre de programa solo hace algo de magia de redirección. Desde labashpágina del manual:La gestión de dicho expediente es, por supuesto, otro tema.
fuente
start-stop-daemonlínea que mencionó la pregunta inicial?Qué tal si:
fuente