Administrar servicios de Systemd con Systemctl en Ubuntu (Parte 1)

logo de systemdSi no eres un usuario avanzado de Ubuntu es posible que, después de leer el título de nuestro artículo de hoy, te hayas preguntado qué demonios es eso de Systemd. Pues bien, básicamente se trata de un mecanismo de inicio y administración de servicios del sistema operativo que interactúa con el núcleo.

Systemd se encargará de poner en marcha los diferentes componentes que deben cargarse después del núcleo y controlar su funcionamiento mientras el sistema esté en marcha.

El principal objetivo de Systemd es unificar la forma en la que las diferentes distribuciones de GNU/Linux administran sus servicios y configuración básica, sustituyendo y mejorando el método anterior, llamado SysV. En Ubuntu ya habían creado su propio método de inicio, al que bautizaron Upstart, pero éste también ha sido sustituido por Systemd desde la versión 16.10.

En el mundo GNU/Linux, los servicios del sistema suelen recibir el nombre de demonios.

Para controlar los servicios administrados por Systemd, disponemos del comando systemctl. Y nuestro objetivo de hoy consiste en profundizar en las posibilidades que nos ofrece.

A modo de ejemplo, usaremos systemd-networkd, el servicio que se encarga de las configuraciones de red en Ubuntu cuando trabajamos en modo texto. systemd-networkd es el responsable de detectar y configurar los adaptadores de red del sistema. Incluso permite definir adaptadores de red virtuales.

Al utilizar el comando systemctl suele añadirse al nombre del servicio el sufijo .service. No obstante, la mayoría de las veces, el comando puede darlo por sobreentendido.

Comprobar el estado de un servicio

Para comprobar el estado en el que se encuentra un servicio, usaremos la orden systemctl añadiéndole la palabra status. Algo como esto:

systemctl status systemd-networkd.service

Para volver al prompt del sistema, pulsamos la tecla q.


Administrar-servicios-de-Systemd-con-Systemctl-en-Ubuntu-001

No obstante, si lo que necesitamos es comprobar un estado específico, podemos recurrir a otros comandos:

  • systemctl is-active: nos permite saber si el servicio se encuentra actualmente en ejecución. Por ejemplo:

    systemctl is-active systemd-networkd.service

    Comprobamos que el servicio se encuentra activo


    Administrar-servicios-de-Systemd-con-Systemctl-en-Ubuntu-002

  • systemctl is-enabled: nos permite saber si el servicio se encuentra actualmente habilitado. Es decir, si se inicia automáticamente durante el arranque del sistema. Por ejemplo:

    systemctl is-enabled systemd-networkd.service

    Como vemos, el servicio está habilitado


    Administrar-servicios-de-Systemd-con-Systemctl-en-Ubuntu-003

  • systemctl is-failed: nos permite saber si se produjo un problema durante el inicio del servicio. Por ejemplo:

    systemctl is-failed systemd-networkd.service

    Si todo fue correcto, nos devolverá la palabra active.


    Administrar-servicios-de-Systemd-con-Systemctl-en-Ubuntu-004

    De lo contrario, obtendremos como respuesta la palabra failed. Además, si el servicio se ha parado de forma intencionada, la respuesta será unknown o inactive.

Arrancar o parar un servicio

Para detener un servicio que se encuentra activo, volveremos a usar la orden systemctl pero, en este caso, añadiéndole la palabra stopt. Algo como esto:

systemctl stop systemd-networkd.service

No obstante, debemos recordar que, para iniciar o parar servicios, necesitaremos privilegios de administración, por lo que lo más común será anteponer la orden sudo:

sudo systemctl stop systemd-networkd.service

Si después consultamos su estado, comprobamos que se encuentra inactivo.


Administrar-servicios-de-Systemd-con-Systemctl-en-Ubuntu-005

Del mismo modo, para iniciar un servicio que se encuentra detenido, usaremos la palabra start:

sudo systemctl start systemd-networkd.service

… Y comprobamos que vuelve a estar activo.


Administrar-servicios-de-Systemd-con-Systemctl-en-Ubuntu-006

Habilitar o deshabilitar servicios

Acabamos de aprender a iniciar o detener servicios de forma manual. Sin embargo, lo normal es que necesitemos que los servicios se inicien automáticamente al arrancar el sistema. Para lograrlo, bastará con utilizar systemctl con la orden enable:

sudo systemctl enable systemd-networkd.service

Comprobamos que el servicio se habilita correctamente


Administrar-servicios-de-Systemd-con-Systemctl-en-Ubuntu-007

Si, en el momento de ejecutar la orden anterior, el servicio está parado, no habremos conseguido que se inicie. No lo hará hasta que reiniciemos el sistema.

Por otro lado, si lo que necesitamos es impedir que un servicio se inicie durante el arranque del sistema, ejecutaremos systemctl con la orden disable:

sudo systemctl disable systemd-networkd.service

Si observas la salida, el servicio se ha deshabilitado, pero systemd ha vuelto a habilitarlo para impedir que perdamos la conexión de red.


Administrar-servicios-de-Systemd-con-Systemctl-en-Ubuntu-008

En cualquier caso, esto no detendría el servicio de forma inmediata. Sencillamente, dejaría de iniciarse con el próximo arranque del sistema.

Reiniciar o recargar un servicio

Para reiniciar un servicio que se encuentra en ejecución, podemos usar un comando como este:

sudo systemctl restart systemd-networkd.service

El servicio se reinicia sin problemas.


Administrar-servicios-de-Systemd-con-Systemctl-en-Ubuntu-009

Esto permitirá, por ejemplo, aplicar los cambios en la configuración de red del sistema sin necesidad de reiniciarlo.

En cualquier caso, cuando el servicio tiene la habilidad de volver a cargar los archivos de configuración sin necesidad de reiniciarse, también podemos utilizar reload:

sudo systemctl reload systemd-networkd.service

Sin embargo, este no es el caso del servicio systemd-networkd.


Administrar-servicios-de-Systemd-con-Systemctl-en-Ubuntu-010

Aún así, cuando no sabemos si el servicio que nos interesa dispone de dicha característica, podemos usar reload-or-restart. Así, systemctl tratará de recargar los archivos de configuración y, si no es posible, reiniciará el servicio:

sudo systemctl reload-or-restart systemd-networkd.service

Así sabemos que se aplicará la acción más adecuada.


Administrar-servicios-de-Systemd-con-Systemctl-en-Ubuntu-011

El artículo de hoy está escrito a partir de Ubuntu Server. Sin embargo, si trabajas con Ubuntu Desktop, comprobarás que al ejecutar la orden del principio, el servicio está inactivo…

Resultado de consultar el estado de systemd-networkd.


Administrar-servicios-de-Systemd-con-Systemctl-en-Ubuntu-012

El motivo es que, en lugar del servicio systemd-networkd, se utiliza NetworkManager. Por ello, el comando que deberíamos ejecutar es el siguiente:

systemctl status NetworkManager.service

Ahora sí obtenemos la salida esperada.


Administrar-servicios-de-Systemd-con-Systemctl-en-Ubuntu-013

Como es lógico, esto mismo debemos aplicarlo al resto del artículo.

Y esto es todo por hoy… Aunque como el tema que nos ha ocupado es más complejo, volveremos sobre él en artículos posteriores.

Espero que te haya resultado interesante.