Lista de todos los servicios que comienzan en el arranque

15

Estoy buscando una manera de obtener una lista de todos los servicios (/etc/init.d o upstart o systemd), que se supone que están iniciando (o que se han iniciado desde) el arranque.

¿Cómo se obtiene una lista de todos los servicios iniciales? - Conozco esa pregunta, y sugiere usarla service --status-all.

Pero eso no me muestra, qué servicios se supone que SE EJECUTAN . Llama a todos los scripts de inicio con " status" argumento. Esta es una lista de todos los servicios que podrían estar ejecutándose.

Pero me gustaría saber, si un servicio, que se había iniciado en el arranque, todavía se está ejecutando.

Ejemplo…

Tengo instalado webfs. Pero no quiero que se ejecute en el arranque. Por lo tanto he deshabilitado que: sudo update-rc.d webfs disable. Y también tengo samba instalada y debería estar ejecutándose en el arranque. Pero se detiene (por cualquier razón). sudo service --status-allno me ayuda aquí:

$ sudo service --status-all 2>/dev/null | grep -E 'samba$|webfs'
 [ - ]  samba
 [ - ]  webfs

Ambos están apagados, pero no tengo ni idea, se supone que ese (samba) está encendido.

Entonces…

¿Cómo podría obtener una lista de todos los servicios que comienzan en el arranque? Y, como extensión, ¿hay una manera fácil de obtener el "estado" de estos servicios (si no, simplemente recorreré esta lista y ejecutaré "service $ service status", o algo así).

Gracias alexander

Editar 2015-05-04: Estoy en Ubuntu 14.04.

El enfoque principal de esta pregunta es el siguiente:

Pero me gustaría saber, si un servicio, que se había iniciado en el arranque, todavía se está ejecutando.

Debido a esto, initctl listno ayuda mucho. Realmente no tiene en cuenta los servicios iniciados por /etc/init.dscripts (en comparación con los scripts de inicio /etc/init).

También una lista de /etc/rc?.d/S*no ayuda. Generaría una lista de servicios, que podrían haberse iniciado en un determinado nivel de ejecución. No me muestra si un servicio que debería haberse iniciado todavía se está ejecutando.

Básicamente, estoy buscando algo como svcs -xSolaris para Ubuntu. Con svcs -x, tendría salida si un servicio, que se inició, ya no se ejecuta. Esto, también lo necesitaría para Ubuntu.

Motivo: Me gustaría tener una comprobación genérica (más o menos ...) para nuestro sistema de monitoreo Icinga / Nagios, que me alertaría, si un servicio ya no se está ejecutando, que debería estar ejecutándose. Como tenemos muchos servidores diferentes para muchos clientes diferentes, en realidad no se escala para definir una lista de servicios "importantes".

Alexander Skwar
fuente
¿Qué versión de Ubuntu?
AB
@Parto La respuesta aceptada en esa pregunta es initctl listqué enumera los procesos que se inician / ejecutan, pero esa lista también incluiría los procesos que se inician manualmente
Sergiy Kolodyazhnyy
@AB Estoy en Ubuntu 14.04.
Alexander Skwar
@Parto askubuntu.com/questions/218/… no proporciona una respuesta. Como escribió @Serg, la respuesta que había que usar initctl list. Pero eso realmente no responde, ya que también mostraría servicios iniciados manualmente. Y no muestra servicios que no se están ejecutando.
Alexander Skwar

Respuestas:

19

Todos los servicios comienzan en el inicio:

initctl list

Lista de todos los servicios que existen en el sistema:

service --status-all
kaxi1993
fuente
Incorrecto. Tampoco proporcione la lista de servicios habilitados (iniciados al inicio). Muestran todos los servicios conocidos (algunos de los cuales pueden estar deshabilitados) y si se están ejecutando o no actualmente (lo que no necesariamente significa que se inicien automáticamente).
Reinier Post
2

Aquí está mi línea grep -i 'runlevel' /etc/init/* | awk '!/#/ && /start on/ && /2/ {gsub("/"," "); print $0 }' | cut -d ' ' -f4-

Se puede lograr una salida un poco más limpia con grep -i 'runlevel' /etc/init/* | awk '/start on/ && /2/ {gsub("/"," "); gsub(":", " ");gsub(".conf"," "); print $3 }'

Ahora entremos en detalles. Todos los trabajos iniciales se almacenan /etc/init/, ¿verdad? Todos los trabajos tienen líneas que indican en qué nivel de ejecución comienzan. Runlevel 2 es un arranque normal, nivel de ejecución predeterminado. Entonces, si seleccionamos todas las líneas que dicen runlevely limpiamos la salida de grep con awk para que coincida solo con las líneas start ony el nivel de ejecución # 2, obtenemos la lista de trabajos iniciales. El resto es solo para las necesidades de formateo, reemplazar / en los nombres de archivos al espacio y cortar la ruta a esos archivos, dejando los nombres de los archivos.

La !/#/parte es para abordar las directivas de inicio posiblemente comentadas, que personalmente había agregado manualmente.

Entre otras cosas, es /etc/rc2.ddonde (si lo entiendo correctamente) tiene secuencias de comandos de menor prioridad.

Una línea cruda para eso es: ls /etc/rc2.d/* | grep S | awk '{sub("S"," "); print $2}

Las secuencias de comandos que en esa carpeta que realmente se ejecutan en el nivel de ejecución 2 se nombran comenzando con S y seguidas de un número de prioridad. Ahora, básicamente, obtenemos todos los archivos que comienzan con S, y solo los enumeramos con solo el nombre de prioridad (todavía tenemos que descubrir cómo limpiar eso).

Como muru señaló correctamente en los comentarios, también hay /etc/init/*.overridearchivos que pueden ". .Modificar cómo se ejecutará un trabajo sin tener que modificar su archivo de configuración directamente" (página de inicio del manual )

En el momento actual, dado que no tengo mucha experiencia con estos archivos, solo puedo sugerir que revise esos archivos .override usando el manual 'grep' '/etc/init/*.override' para enumerar los servicios que se indican que se inicien manualmente con initctlo servicescomandos.

Sergiy Kolodyazhnyy
fuente
Tenga en cuenta que debido a las dependencias de los eventos, no se puede determinar fácilmente si un servicio determinado dará como resultado el inicio de otros servicios. También está el pequeño asunto de los .overridearchivos.
muru
@Serg gracias. Pero eso solo se ocupa de cosas nuevas. Además, "ls /etc/rc2.d/* ..." no ayuda mucho. Mostraría qué servicios podrían haberse iniciado. Pero no muestra qué servicios aún se están ejecutando. Supongo que el punto principal de mi publicación no estaba claro. Estoy buscando: pero me gustaría saber, si un servicio, que se había iniciado en el arranque, todavía se está ejecutando. No sé si conoces Solaris. Allí, simplemente haría "svcs -x", y si devuelve algo, sé que algo no se está ejecutando. Necesitaría algo como esto para Ubuntu.
Alexander Skwar
Bueno, uno podría escribir un script o una función bashrc para comparar las salidas de mi one liner allí y de la lista initctl. ¿Quieres que publique eso?
Sergiy Kolodyazhnyy
@Serg bien, si estás ofreciendo;)
Alexander Skwar
2

Enumere todos los servicios y el estado de nivel de ejecución respectivo: estilo chkconfig:

# sysv-rc-conf --list

acpid        2:on       3:on    4:on    5:on
apache-htcac 0:off      1:off   2:off   3:off   4:off   5:off   6:off
apache2      0:off      1:off   2:on    3:on    4:on    5:on    6:off

Edición basada en texto interactivo de todos los listados:

# sysv-rc-conf

l SysV Runlevel Config   -: stop service  =/+: start service  h: help  q: quit qk
x 
x service      1       2       3       4       5       0       6       S 
x ----------------------------------------------------------------------------
x acpid       [ ]     [X]     [X]     [X]     [X]     [ ]     [ ]     [ ]
x apache-ht$  [ ]     [ ]     [ ]     [ ]     [ ]     [ ]     [ ]     [ ]
x apache2     [ ]     [X]     [X]     [X]     [X]     [ ]     [ ]     [ ]
x
x Use the arrow keys or mouse to move around.      ^n: next pg     ^p: prev pg
x                        space: toggle service on / off

Podría tener que instalarlo si no está allí:

apt install sysv-rc-conf
bzean
fuente