¿Hay alguna manera de ver el árbol de ejecución de systemd?


63

Lo que quiero decir bajo la pregunta es: ¿hay alguna manera de volcar la lista ordenada (como lo hace pstree para los procesos) para ver cómo systemd ejecutó el conjunto de unidades suministrado, es decir, el árbol después de que se resolvieron las dependencias y los trabajos se pusieron en cola para la ejecución ? Sé que puede hacerlo analizando los datos de estado del sistema, pero ¿hay alguna forma rápida de ver ese árbol? Sería de gran ayuda en la investigación de fallas (por ejemplo, si ve que el proceso de arranque se atascó en alguna unidad, podrá determinar la ubicación aproximada para su investigación más profunda.


He creado una herramienta de visualización para systemd. Puede verificar y probar la herramienta en github.com/ywiyogo/systemd-visual
Yongkie

Respuestas:


71

systemd-analyzees tu amigo. Por ejemplo, systemd-analyze critical-chainsalidas que bloquean el árbol de demonios. La mía por ejemplo:

graphical.target @20.211s
└─multi-user.target @20.211s
  └─nginx.service @19.348s +862ms
    └─network.target @19.347s
      └─NetworkManager.service @10.315s +9.031s
        └─basic.target @10.312s
          └─timers.target @10.311s
            └─systemd-tmpfiles-clean.timer @10.311s
              └─sysinit.target @10.295s
                └─systemd-update-utmp.service @10.167s +127ms
                  └─systemd-tmpfiles-setup.service @10.124s +41ms
                    └─local-fs.target @10.097s
                      └─home-entd-Downloads.mount @10.093s +2ms
                        └─home.mount @9.326s +672ms
                          └─systemd-fsck@dev-sda6.service @8.472s +696ms
                            └─dev-sda6.device @8.471s

NetworkManager, por ejemplo, básicamente mantiene todo el arranque.

Si desea tener una vista más detallada, puede representar toda la cadena de ejecución en un archivo svg. systemd-analyze plot > something.svggenera toda la cadena (más de 120 módulos) como barras de progreso en un archivo svg de alta resolución que muestra estados bloqueados y otros problemas.

Finalmente, tiene una systemd-analyze dotherramienta que genera un archivo de puntos que genera toda la jerarquía: systemd-analyze dot | dot -Tpng -o stuff.png con la herramienta de puntos también puede generarlo como archivos ps y svg.

Todas las herramientas anteriores están integradas en la herramienta de análisis systemd que viene por defecto con systemd en archlinux al menos. Creo que también hay algunos proyectos de terceros que se ocupan de eso.


Gracias por su respuesta, sin embargo, no aborda las preguntas y solo reitera partes de mi pregunta (mencioné que estoy al tanto de cómo hacerlo analizando los datos de estado de systemd). Por lo tanto, la pregunta es cómo obtener un árbol similar a un árbol de la secuencia de arranque después de que se resuelvan todas las dependencias (por ejemplo, después del arranque). La cadena crítica es casi lo mismo (a pesar de que es un árbol de abajo hacia arriba) pero no enumera todas las unidades iniciadas. Lo que se pregunta en la pregunta: un árbol que enumera cada unidad que se ejecutó hasta cierto punto (por ejemplo, golpear el objetivo multiusuario).
galaxia

44
systemd-analyze plot > something.svgtiene tres ejecuciones completas con objetivos (es lo más parecido a lo que quieres). systemd-analyse dot es un gráfico completo de dependencias (es la representación más correcta). ¿No son estos lo que quieres? En la trama, solo busque el objetivo y vea lo que necesita también. Las mismas dependencias son gráficas exactamente enumeradas, si es que enciende mucho el kit de herramientas de análisis de gráficas y selecciona el punto del gráfico para el que desea ver las dependencias (la herramienta de puntos tiene más configuraciones). Consulte la página de manual: freedesktop.org/software/systemd/man/systemd-analyze.html --order and similar
IBr

1
Desde la página de manual: Esto traza todas las dependencias de cualquier unidad cuyo nombre comienza con "avahi-daemon": $ systemd-analyze dot 'avahi-daemon.*' | dot -Tsvg > avahi.svg $ eog avahi.svgEsto traza las dependencias entre todas las unidades objetivo conocidas:systemd-analyze dot --to-pattern='*.target' --from-pattern='*.target' | dot -Tsvg > targets.svg $ eog targets.svg
IBr

1
IBr, pero esto es inutilizable en la consola de texto, desafortunadamente. Realmente aprecio el tiempo que dedicó a la respuesta (y es correcto si desea obtener algunos datos para analizar), pero no aborda la pregunta original, por lo que puedo aceptarla. Lo siento.
galaxia

1
Está bien, no hay problema. Me encantan las herramientas de línea de comandos :) :)
2014

13

Es posible que aún no responda completamente su pregunta, pero intente con la --fuzzopción

systemd-analyze critical-chain --fuzz 1h

Nota También puede especificar la unidad de s para ver su cadena crítica , por lo que no está limitado a la multi-user.target

systemd-analyze critical-chain network.target local-fs.target

Espero que esto ayude


12

No estoy seguro de entender bien la pregunta, pero hay visualizaciones de árbol disponibles con los siguientes comandos:

sudo systemctl status

Y también :

sudo systemctl list-dependencies 

Espero que esto ayude :)

Además, podría ser útil para otros fines construir un árbol de las carpetas de enlaces simbólicos systemctl:

tree /etc/systemd/system

En realidad, fue realmente útil descubrir unidades antiguas / con errores que estaban ralentizando el inicio de mi sistema, para deshabilitarlas luego usando el systemctl disablecomando.

EDITAR

Dicho esto, estoy realmente de acuerdo con el OP en que esta funcionalidad básica se debe proporcionar a través de herramientas de línea de comandos, y no una herramienta gráfica ... ¿Qué sucede si no puede iniciar X? ¿Cómo manejas tu archivo svg entonces?

En realidad, hay un camino. Si no puede usar scp(herramienta ssh) para recuperar su archivo en otra computadora, en fbirealidad podría ayudarlo :)

sudo systemd-analyze plot > /home/user/startup.svg
fbi /home/user/startup.svg

Trabajé en mis TTY. Simplemente navegue dentro de la imagen con flechas. Hay opciones de zoom, para hacer una lista fbi -h.

Nuevamente espero que esto ayude. Está disponible en Archlinux y Ubuntu repos.

EDITAR 2:

fbino funciona sobre ssh. Puede reenviar X de esta manera ssh -Y user@server, pero necesita un servidor X que se ejecute en su servidor remoto.

La mejor apuesta aquí es usar sshfs. Funciona GENIAL en el espacio de usuario, por ejemplo con nautilus. Hay una pequeña configuración que hacer, ver:

sudo vim /etc/fuse.conf #type a, uncomment the user_allow_other line and ESC :wq
sudo mkdir /mnt/yourmountingdir
sudo chown user:user /mnt/yourmountingdir
sshfs user@remotemachine.com:/home/user /mnt/yourmountingdir/ -o allow_other #Asks for host trusting and password
sudo fusermount -u /mnt/yourmountingdir/ #To disconnect and unmount

La pregunta es sobre el árbol de ejecución para todas las unidades activadas que systemd pasó después de la resolución de dependencia. Entonces esta respuesta es una señorita.
galaxia

¿Quizás su pregunta es adecuada para una solicitud de función? Claro que ayudaría. De todos modos, publiqué esta respuesta después de tropezar con su pregunta porque de alguna manera se parecía a otra pregunta sobre la que necesitaba información, y sentí que faltaban algunos ejemplos básicos (como las cosas que ha intentado y no funcionó, eso realmente hubiera sido ayudó a aclarar), especialmente para personas como yo que luchan después de haber perdido System V init y su práctico archivo rc.conf. Lo siento, mi respuesta no encajaba. Sin embargo, no merece un voto negativo.
Joel.O

Editado con una solución alternativa a su problema. Espero que ayude de nuevo.
Joel.O

No pude usar fbi sobre ssh en mi servidor. Pero sshfsfunciona aún mejor. Ver EDITAR 2.
Joel.O
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.