¿Cómo depuro los scripts de Upstart?

67

Por alguna razón, recibo un error durante las actualizaciones de apport , cuya causa es

% sudo service apport start
start: Job failed to start

Bajo sysvinit, podría depurar este tipo de problema ejecutando, por ejemplo

sudo sh -x /etc/init.d/whatever start

pero eso no parece corresponder a Upstart. ¿Qué debería probar a continuación?

Resulta que hay una solución que permitirá que la instalación continúe. Pero todavía estoy interesado en la pregunta general de cómo se puede rastrear el guión.

billar
fuente
1
Estoy trabajando en una respuesta más exhaustiva, pero gracias por el enlace a la solución alternativa, ¡me pasó lo mismo hoy actualizando natty!
Mark Russell
Jaja, y lanzaron la solución hace 12 minutos. ¿No es divertido ejecutar Beta? (¡en realidad no!)
Mark Russell
+ Muhammad publicó la respuesta correcta a continuación.
Travis Reeder
Encontré información de depuración útil en /var/log/syslog.
Matt

Respuestas:

29

Toda la siguiente información (y mucha más ayuda útil de Upstart) proviene de The Upstart Cookbook . La sección 18 cubre la depuración. http://upstart.ubuntu.com/cookbook/#debugging

En este caso específico de rastreo de una estrofa "script" de un trabajo Upstart, debe agregar las siguientes líneas justo debajo de la palabra "script":

exec 2>>/dev/.initramfs/myjob.log
set -x

La razón de la ubicación extraña es que /dev/.initramfs/ está disponible en el arranque muy temprano, antes de que se cargue el sistema de archivos raíz, y continúa estando disponible después del arranque. Supongo que con apport, sin embargo, probablemente no necesites usar esa ruta. Aún así, es bueno saber la opción.

También se debe tener en cuenta que todas las secuencias de comandos se ejecutan con set -ecualquier comando que falle, se cerrará por completo. Lo cual tiene sentido, ya que uno debe tener mucho cuidado al ejecutar scripts como root.

Recomiendo consultar el libro de cocina Upstart vinculado anteriormente en general para cualquier persona que trabaje con trabajos de Upstart.

Mark Russell
fuente
Gracias por eso, si no hubiera visto que el error se resolvió, probablemente habría modificado el script para que se active set -xcomo usted sugiere. Sobre todo me preguntaba si había alguna forma más limpia de hacerlo.
Poolie
Sí, no que yo sepa (y si no está en el libro de cocina, eso significa que probablemente no lo esté). Aparte de esa idea, la mayoría de las técnicas de depuración mencionadas son más sobre la resolución de problemas de los eventos Upstart y Upstart, que es donde generalmente me encuentro. :)
Mark Russell
Y sin embargo, este método no funcionará si setuidy setgidse utilizan en puestos de trabajo.
0xC0000022L
/dev/.initramfs no siempre está presente. Acabo de encontrar una máquina que no tiene este camino.
Sarge Borsch
110

Upstart registra la ejecución de su servicio en un archivo de registro con el mismo nombre /var/log/upstart/your-service-name.log. Debería ser útil.

Muhammad Gelbana
fuente
2
Correcto, parece que esto incluye los trabajos más exigentes, por lo que si lo activara set -x, probablemente aparecería allí.
Poolie
1
¡Pongo una declaración de registro basada en eco en mi script /etc/init.d/Xservice pero no aparece en esta ubicación! SO: Ubuntu 14.04 Trusty
Champ
¿Por qué no hacer syslog? ¿Puedo sugerir una característica general, tal vez rsyslog en sí misma, que el advenedizo y cualquier componente usarían para escribir en syslog si no está disponible, o en un lugar temporal que sería transferido a syslog lo antes posible? Me llevó medio día encontrar esto. Por favor envíe esta observación TIA.
Papou
44
Esto ya no parece ser cierto en 16.04, aparentemente desde 15.10 al menos: los últimos archivos en ese directorio están fechados justo antes de la versión 15.10.
MGF
1
@FGM esto se debe a que 16.04 ya no usa el sistema de arranque, usa systemd. Se accede a los registros conjournalctl
Jeremy