Mi problema:
Estoy escribiendo un script bash y en él me gustaría verificar si se está ejecutando un servicio determinado.
Sé cómo hacer esto manualmente, con $ service [service_name] status
.
Pero (especialmente desde el cambio a systemd) que imprime un montón de texto que es un poco complicado de analizar. Supuse que hay un comando hecho para scripts con salida simple o un valor de retorno que puedo verificar.
Pero buscar en Google solo produce una tonelada de resultados de "Oh, solo ps aux | grep -v grep | grep [service_name]
". Esa no puede ser la mejor práctica, ¿verdad? ¿Qué sucede si se está ejecutando otra instancia de ese comando, pero ninguna iniciada por el script de inicio SysV?
¿O debería callarme y ensuciarme las manos con un poco de pgrep?
fuente
inactive
oactivating
ambossystemctl status
ysystemctl is-active
salen con 3. (a partir de systemd-241 ) Solución:systemctl show service | grep -qx ActiveStatus=activating
foo
hace algo al sistema que implica reiniciar y utiliza un servicio de una sola vez, por ejemplo,foo_cleanup
en el próximo inicio para limpiar las cosas. Estoy probando esto (mi script también está programado como un servicio) y quiero recopilar errores después, pero ¿cuándo es después (vsauce music)? Bueno, uno de los criterios es quefoo_cleanup
ha terminado ("dejó de estar activo").systemctl
tiene un modo adecuado para secuencias de comandos; use enshow
lugar destatus
y agregue las opciones-p
/--properties
y--value
para obtener solo la salida que desea.Aquí hay un ejemplo (de un sistema Ubuntu 17.04):
Correr (o de otro modo) es a
SubState
. Si desea saber si un servicio está activo, use la propiedadActiveState
Notas de
man
:fuente
--version
opción con systemctl.Como complemento a la respuesta de Zanna, la
--value
opción parasystemctl show
se ha introducido con la versión 230 de systemd . Por lo tanto, es posible que no esté disponible en ciertas distribuciones como Debian Jessie.En este caso, se puede emular la opción usando sed:
fuente
Esto me resulta útil para la ejecución de la línea de comandos o si está creando scripts.
Copiado de @StephenKitt
Esto verificará si el servicio está inactivo y reiniciará el servicio.
la
||
no comprueba si el valor de retorno de systemctl no es cero sentido si no es activo como se ha explicado por el autor.fuente
Llego demasiado tarde a la fiesta, sin embargo, el uso de systemctl está activo junto con
&&
y||
en este script no será el caso todo el tiempo. El siguiente es uno que utilicé para tomcat, pero puedo usarlo en el método para tomar argumentos y pasar el nombre del servicio como argumentos si tiene que verificar múltiples servicios pero está fuera de alcance aquí.Así es como hice uso de ... Simplemente compartiendo el mío.
y por la simplicidad y las cosas fáciles, siga a otros explicados aquí:
fuente
if systemctl is-active --quiet tomcat.service
? Además,[[
no es shell estándar.&&
y||
.En lugar de usar el comando sed como en la respuesta de Oxmel, es suficiente
cut -d'=' -f 2
para todo tipo de propiedades consultadas:por ejemplo:
fuente
Acabo de encontrar este pequeño guión genial:
Fuente
fuente