Tengo un demonio personalizado que es administrado por advenedizo en mi servidor Ubuntu. Funciona perfectamente, excepto que necesito capturar (registrar) la salida del daemon. La página oficial de estrofas dice que puedo usar console logged
para hacer esto, pero ¿en qué archivo se registra?
También he leído que console logged
es ya no es válida una estrofa . Actualmente estoy usando 0.3.9 (Hardy) pero actualizaré a 0.6.x (Lucid) en unos pocos meses. Si console logged
de hecho no funciona con versiones posteriores, ¿qué uso en su lugar?
Respuestas:
Este fragmento canalizará la salida de su servicio en el registrador, mientras le permite ejecutar el proceso de servicio (reemplazando así el proceso de shell) para que el arranque no se confunda. También se asegura de que el proceso del registrador se reparented a init, por lo que no es un elemento secundario de su servicio, y evita dejar cruft en el sistema de archivos, a pesar de que necesita crear un Fifo temporalmente.
Así es como funciona:
mkfifo /tmp/myservice-log-fifo
simplemente crea el archivo especial fifo (también conocido como tubería). Escribaman 7 fifo
para más información.( logger ... </tmp/myservice-log-fifo & )
comienza la lectura del registrador desde el fifo, en segundo plano. Los parens hacen que el proceso del registrador se reparented a init, en lugar de seguir siendo un hijo del proceso de shell actual.exec >/tmp/myservice-log-fifo
redirige el stdout del shell actual al fifo. Ahora tenemos un descriptor de archivo abierto para esa quincena, y ya no necesitamos la entrada del sistema de archivos ...rm /tmp/myservice-log-fifo
así que lo eliminaremosexec myservice 2>/dev/null
simplemente ejecuta el servicio de la forma habitual. Stdout ya está yendo al Fifo, y eso no cambiará cuando se ejecute el nuevo programa.ACTUALIZACIÓN:
set -e
no es necesario ya que Upstart ejecuta scripts con esta opción de forma predeterminada (consulte http://upstart.ubuntu.com/cookbook/#develop-scripts-using-bin-sh )fuente
set -e
?set -e
hace que el script salga inmediatamente si falla algún comando. Sin esa línea, el script continuaría ejecutando comandos posteriores de manera inútil (y posiblemente peligrosa).exec 2>&1
sobre larm
línea y elimine2>/dev/null
la última línea.Para versiones recientes de Ubuntu (12.04+), simplemente use
Y la salida del demonio (STDOUT & STDERR) se agregará a
/var/log/upstart/<service>.log
http://upstart.ubuntu.com/cookbook/#console-log
fuente
Si usa la
console output
estrofa y luego canaliza la salida de su script alogger
(la interfaz de comando de shell al módulo de registro del sistema syslog (3)), entonces eso funcionará.Por ejemplo
iniciará sesión en
/var/log/messages
Por ejemplo
iniciará sesión
/var/log/messages
y etiquetará cada mensaje conmy-script
logger --help
para las opciones de uso del registrador.(Estoy en Amazon Linux AMI, que está basado en Centos 5.x; YMMV)
fuente
logger
, no en el proceso que realmente desea que gestione.No conseguí el
mkfifo
truco para funcionar satisfactoriamente; no parecía capturar stderr, y los intentos de redirigir causaron que Upstart salga sin ningún error.También tiene un efecto secundario desafortunado de hacer que el
logger
proceso se quede como un niñoinit
, por lo que la información sobre quién "posee" el registrador se pierde, y cualquiera que no esté al tanto de estomkfifo
podría suponer que es un proceso pendiente que se puede matar.En cambio, terminé con la siguiente solución, que resuelve todos estos problemas. Hace
logger
que se convierta en un proceso hijo, al tiempo que conserva el servicio como el proceso raíz. Desafortunadamente, requiere ejecuciónbash
, pero se ve sucio.Esto utiliza un truco que redirige stdout y stderr a un comando. Como ejecutamos el servicio dentro del
bash
comando, esto tiene el efecto secundario de reemplazar el shell y hacer que bash se convierta mágicamente en un proceso secundario del servicio, como se muestra enps aufxw
:Por alguna razón, el comando anterior tiene que estar envuelto en a
bash -c
. Supongo que esto se debe a que Upstart solo pretende ejecutar su script a través de Bash, pero en realidad no lo es. Si alguien puede sugerir una forma de evitar el shell de bash extra, sería genial.fuente
exec bash -l << EOF
que no perdiera allí.Esto es feo pero hasta ahora lo mejor que he encontrado
exec / ruta / al / servidor >> /tmp/upstart.log 2> & 1
fuente
También puede redirigir la salida a syslog, p. Ej.
Sin embargo, la canalización puede causar que el arranque confunda el PID del proceso de registro con el PID del demonio.
fuente
expect fork
oexpect daemon
estrofa. O, de locat
contrario, podría incluir el archivo pid en el mensaje de registro.Otra alternativa es usar tee como:
para obtener tanto el archivo de inicio como la salida de syslog
fuente