Gestionar servicios en Systemd

Este es uno de los capítulos del tutorial Trabajando con Systemd. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

En el capítulo anterior de este tutorial, vimos como conocer el estado de cada una de nuestras unidades. También, estuvimos viendo como podíamos cambiar el estado de esas unidades. Pero ¿que significa en concreto que una unidad esté habilitada o deshabilitada?. Y ¿que quiere decir que esté iniciada o no?. Y por último, que significado tiene emascarar unidades, y en particular servicios en Systemd.

En esta nueva entrega del tutorial sobre como trabajar con Systemd, vamos a ver con detalle como gestionar servicios en Systemd. Que opciones tenemos y que es lo que podemos hacer, para realizar una correcta gestión de los servicios.

Gestionar servicios en Systemd

Gestionar servicios en Systemd

Una mirada atrás

Como comenté en el capítulo anterior de este tutorial, los scripts de inicialización se solían ubicar en /etc/rc.d/init.d/. Estos scripts solían estar implementados en Bash, y permitían conocer el estado de los servicios y demonios de un sistema. Esto se ha cambiado en Systemd por Unidades de servicio, tal y como comentábamos en el capítulo anterior.

Estas unidades de servicio en Systemd tienen un propósito similar a los scripts init. Permitiendo hacer las mismas operaciones que hacíamos anteriormente. Esto lo podemos resumir en la siguiente tabla,

Init Systemd Description
service name start systemctl start name.service Inicia un servicio
service name stop systemctl stop name.service Detiene un servicio
service name restart systemctl restart name.service Reinicia un servicio
service name condrestart systemctl try-restart name.service Reinicia un servicio solo si está en funcionamiento
service name reload systemctl reload name.service Recarga la configuración de un servcio
service name status systemctl status name.service systemctl is-active name.service Comprueba si un servicio está funcionando.
service –status-all systemctl list-units type service all Muestra el estado de todos los servicios.
chkconfig name on systemctl enable name.service Habilita un servicio
chkconfig name off systemctl disable name.service Deshabilita un servicio
chkconfig –list name systemctl status name.service systemctl is-enabled name.service Comprueba si un servición está habilitado
chkconfig –list systemctl list-unit-files –type service Lista todos los servicios y comprueba si están habilitados
chkconfig –list systemctl list-dependencies –after Lista los servicios que tienen que iniciarse antes de una unidad
chkconfig –list systemctl list-dependencies –before Lista los servicios que tienen que iniciarse después de una unidad

En la tabla anterior, he indicado las operaciones a realizar sobre los servicios indicando la extensión .service. Sin embargo, no es necesario escribirla, así, por ejemplo, las dos siguientes líneas son completamente equivalentes,

systemctl status ntp.service
systemctl status ntp

Activar, habilitar y enmascarar

Para gestionar servicios en Systemd, hay que tener en claro los tres estados en los que se puede encontrar un servicio. Estos estados, son los siguientes,

  • Activo e inactivo
  • Habilitado e inabilitado
  • Enmascarado o desenmascarado

Activo e inactivo

Un servicio está activo cuando está en funcionamiento. Así utilizaremos las siguientes herramientas para conocer su estado y gestionar servicios,

  • systemctl is-active servicio. Nos permite saber si el servicio está activo. Nos devolverá el valor active en caso de estar activo. En otro caso nos devolverá inactive.
  • Para activar el servicio utilizaremos sudo systemctl start servicio.
  • Mientras que para detenerlo utilizaremos sudo systemctl stop servicio.
  • Para reiniciar un servicio utilizaremos sudo restart servicio. Esta orden detiene el servicio y lo inicia de nuevo. Si el servicio no está iniciado cuando ejecutamos esta orden, igualmente, iniciará lo iniciará.
  • sudo systemctl try-restart servicio tiene el mismo comportamiento que el anterior, pero si el servicio no está iniciado al ejecutar esta orden, no se iniciará el servicio. Es decir, que para que esta orden funcione correctamente, el servicio debe estar iniciado.
  • Para recargar la configuración de un servicio sin interrumpir su funcionamiento podemos utilizar sudo systemctl reload servicio. Sin embargo, esto no está soportado por todos los servicios. Si el servicio contra el que estamos ejecutando esta orden, no soporta lo soporta, simplemente se ignorará.
  • En ocasiones, interesará recargar la configuración, aunque sea a costa de parar el servicio. Para esto, se han creado dos opciones interesantes como son sudo systemctl reload-or-restart service y sudo systemctl reload-or-tyr-restart service, que se comportan como es de esperar.

Un servicio que soporta la recarga de la configuración es Apache. Esto implica que cada vez que cambiemos la configuración, no necesitamos reiniciar Apache, simplemente tenemos que ejecutar,

sudo systemctl reload apache2

Habilitado o inhabilitado

El siguiente estado en el que podemos encontrar los servicios en Systemd es el de habilitado o inhabilitado. Que un servicio esté habilitado nos indica que se iniciará de forma automática cuando iniciemos el equipo. Por contra estará inhabilitado, cuando no se inicie de forma automática. Este estado, no es incompatible con el anterior, es decir, un servicio puede estar activo y deshabilitado, inactivo y habilitado, y sucesivamente. Igual que en el caso anterior, para conocer si un servicio está habilitado o no, y para habilitarlo o inhabilitarlo, utilizaremos las siguientes órdenes,

  • systemctl is-enabled servicio, nos permite saber si un servicio está habilitado, en cuyo caso nos devolverá el valor enabled, en caso contrario, nos devolverá el valor disabled.
  • Para que un servicio se inicie de forma automática con nuestro equipo ejecutaremos las siguiente orden sudo systemctl enable servicio.Esta instrucción crea los enlaces simbólicos de /user/lib/systemd/system/servicio.service en /etc/systemd/system solo si estos enlaces no existen. En el caso de que existan no los reescribe.
  • Si queremos por contra, asegurarnos de que los enlaces simbólicos se reescriben, utilizaremos la instrucción, sudo systemctl reenable service. Esta instrucción inhabilita y vuelve a habilitar el servicio, reescribiendo los enlaces simbólicos.
  • Si no queremos que nuestro servicio arranque con nuestro equipo, ejecutaremos la siguiente orden sudo systemctl disable service. El funcionamiento de esta instrucción es bastante sencillo. Simplemente lee el contenido de la sección [Install] y elimina los enlaces que hemos indicado anteriormente.

Enmascarado y desenmascarado

El último estado que nos queda por definir para gestionar servicios en Systemd es el enmascaramiento. Un servicio está enmascarado cuando no se puede iniciar de forma manual o por medio de otro servicio. Por supuesto, cuando un servicio está enmascarado no puede ser iniciado en el arranque de la máquina. Es decir, un servicio enmascarado puede estar activo, pero no puede estar habilitado. Ahora bien, si el servicio no está activo y está enmascarado, no se podrá iniciar… (menudo galimatías).

Este estado no tiene una instrucción que nos permite saber de un golpe si un servicio está enmascarado o no. Sin embargo, siempre podemos utilizar una instrucción como,

ans=`systemctl status ntp | grep masked`; if [ ${#ans} -gt 0 ];then echo "masked";else echo "Not masked";fi

Que nos devolverá el valor masked cuando el servicio esté enmascarado y Not masked cuando no esté enmascarado.

Por otro lado,

  • sudo systemctl mask servicio, nos permite enmascarar cualquier servicio, con independencia de que este habilitado o no lo esté. En el caso de que esté habilitado quedará como no habilitado. Eso si, si el servicio está activo, permanecerá activo.
  • Por otro lado sudo systemctl unmask servicio nos permite desenmascarar cualquier servicio.

Es posible que no interese desactivar el servicio antes de enmascararlo. Para hacer esto, podemos ejecutar las siguientes líneas que primero comprobará si está activo, y en cuyo caso, lo desactivara. En segundo paso, y si no está enmascarado lo enmascarará,

ans=`systemctl is-active service`; if [ $ans == 'active' ];then sudo systemctl stop service;fi
ans=`systemctl status service | grep masked`; if [ ${#ans} -gt 0 ];then echo "masked";else echo "Not masked";sudo systemctl mask service;fi

Conclusión

Como resumen de este capítulo sobre gestionar servicios en Systemd, podemos decir que existen tres niveles de apagado.

  • El primer nivel de apagado, simplemente termina la instancia del servicio que este en funcionamiento. Esto se hace con la instrucción sudo systemctl stop service. Esto simplemente termina la instancia del servicio que esté en funcionamiento.
  • El segundo nivel de apagado, evita que un servicio se inicie con el arranque de la máquina. Para impedir que un servicio arranque con la máquina, tan solo, tenemos que ejecutar la siguiente instrucción sudo systemctl disable service.
  • Por último, el tercer nivel de apagado es el enmascaramiento. Este nivel de apagado impedirá que se inicie un servicio, ni de forma manual, ni en el arranque de la máquina.

Se trata de tres estados que no son totalmente incompatibles, tal y como hemos visto en el desarrollo de este capítulo. Tendrás que seleccionar que estado se adecua mas a la situación actual de tu servicio.

Soy consciente de que hay muchos usuarios, que siguen prefiriendo el sistema anterior a Systemd. Sin embargo, Systemd ha venido para quedarse, y cuanto antes nos hagamos con este nueva forma de trabajar mas provecho podremos sacarle.


Más información,

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *