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
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 valoractive
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
ysudo 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 valorenabled
, en caso contrario, nos devolverá el valordisabled
.- 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,