Mi problema:
Estoy escribiendo un script bash y en él me gustaría verificar si un servicio determinado se está ejecutando.
Sé cómo hacer esto manualmente, con $ service [service_name] status
.
Pero (especialmente desde el cambio a systemd) eso imprime un montón de texto que es un poco complicado de analizar. Asumí que hay un comando creado para scripts con salida simple o un valor de retorno que puedo verificar.
Pero buscar en Google solo produce una tonelada de "Oh, solo ps aux | grep -v grep | grep [service_name]
" resultados. Esa no puede ser la mejor práctica, ¿verdad? ¿Qué sucede si se está ejecutando otra instancia de ese comando, pero no una iniciada por el script de inicio de SysV?
¿O debería callarme y ensuciarme las manos con un poco de pgrep?
Respuesta aceptada:
systemctl
tiene un is-active
subcomando para esto:
systemctl is-active --quiet service
saldrá con estado cero si service
está activo, distinto de cero de lo contrario, lo que lo hace ideal para scripts:
systemctl is-active --quiet service && echo Service is running
Si omite --quiet
también enviará el estado actual a su salida estándar.
Como lo señaló don_crissti, algunas unidades pueden estar activas aunque no se esté ejecutando nada para brindar el servicio:las unidades marcadas como "RemainAfterExit" se consideran activas si salen con éxito, la idea es que brindan un servicio que no necesita un demonio (por ejemplo, configuran algún aspecto del sistema). Sin embargo, las unidades que involucren demonios solo estarán activas si el demonio aún se está ejecutando.