Saltar la navegación

Unidades de servicio

Inicialmente, Debian y la mayoría de las distribuciones GNU/Linux, venían con un inicio del tipo SysV, en el cual se utilizan scripts de bash situados en /etc/init.d para que el administrador controle el estado de los servicios y demonios del sistema. En la actualidad estos scripts se han reemplazado por unidades de servicio de systemd.

Las unidades de servicio se describen a través de un fichero con extensión .service, y a través del comando systemctl se pueden llevar a cabo las tareas habituales que se realizan con los servicios: iniciarlo, pararlos, etc.

El comando service y los scripts del directorio /etc/init.d, se conservan todavía y funcionan correctamente, fundamentalmente por razones de compatibilidad, pero es aconsejable utilizar el comando systemctl.

Para conseguir un listado de las unidades de servicio systemd del sistema, simplemente tenemos que añadir la opción --type service a los comandos de listado que ya hemos visto.

# systemctl --type service
# systemctl list-units --type service
# systemctl list-units --type service --all
# systemctl list-unit-files --type service
# systemctl list-unit-files --type service 'N*'

La información fundamental que nos aportan los listados anteriores es la de saber si el servicio está o no activo. Para conseguir algo más de detalle tenemos que usar la acción status.

# systemctl status NetworkManager
● NetworkManager.service - Network Manager
Loaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; preset: enabled)
Active: active (running) since Wed 2023-11-08 06:26:27 CET; 2h 8min ago
Docs: man:NetworkManager(8)
Main PID: 738 (NetworkManager)
Tasks: 3 (limit: 9190)
Memory: 16.1M
CPU: 5.859s
CGroup: /system.slice/NetworkManager.service
└─738 /usr/sbin/NetworkManager --no-daemon

nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.0795] device (wlp3s0): supplicant interface state: authenticating>
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.4829] device (wlp3s0): supplicant interface state: associating ->>
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.8590] manager: rfkill: Wi-Fi hardware radio set disabled
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.8591] device (wlp3s0): state change: activated -> unavailable (re>
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.8911] dhcp4 (wlp3s0): canceled DHCP transaction
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.8912] dhcp4 (wlp3s0): activation: beginning transaction (timeout >
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.8912] dhcp4 (wlp3s0): state changed no lease
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.9482] device (wlp3s0): set-hw-addr: set MAC address to 5A:53:0E:E>
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.9602] audit: op="radio-control" arg="wireless-enabled:off" pid=16>
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.9621] manager: rfkill: Wi-Fi now disabled by radio killswitch

El formato general de esta acción es:

# systemctl [opciones] status [PATTERN...|PID...]]

Como se ve, puede usarse el PID del servicio para pedir información.

# systemctl status 738
● NetworkManager.service - Network Manager
Loaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; preset: enabled)
Active: active (running) since Wed 2023-11-08 06:26:27 CET; 2h 8min ago
Docs: man:NetworkManager(8)
Main PID: 738 (NetworkManager)
Tasks: 3 (limit: 9190)
Memory: 16.1M
CPU: 5.859s
CGroup: /system.slice/NetworkManager.service
└─738 /usr/sbin/NetworkManager --no-daemon

nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.0795] device (wlp3s0): supplicant interface state: authenticating>
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.4829] device (wlp3s0): supplicant interface state: associating ->>
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.8590] manager: rfkill: Wi-Fi hardware radio set disabled
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.8591] device (wlp3s0): state change: activated -> unavailable (re>
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.8911] dhcp4 (wlp3s0): canceled DHCP transaction
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.8912] dhcp4 (wlp3s0): activation: beginning transaction (timeout >
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.8912] dhcp4 (wlp3s0): state changed no lease
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.9482] device (wlp3s0): set-hw-addr: set MAC address to 5A:53:0E:E>
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.9602] audit: op="radio-control" arg="wireless-enabled:off" pid=16>
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.9621] manager: rfkill: Wi-Fi now disabled by radio killswitch

La información que nos muestra la acción status consiste en el estado en tiempo de ejecución de la unidad o unidades especificadas, seguido de los 10 registros más recientes que hay sobre el servicio en el diario de systemd. Esto último puede modificarse con la opción --line acompañado del número de líneas que queramos. Y también, si alguna información apareciera truncada, podemos pedir que se nos muestre completa usando la opción --full.

# systemctl status NetworkManager --line 3
● NetworkManager.service - Network Manager
Loaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; preset: enabled)
Active: active (running) since Wed 2023-11-08 06:26:27 CET; 2h 8min ago
Docs: man:NetworkManager(8)
Main PID: 738 (NetworkManager)
Tasks: 3 (limit: 9190)
Memory: 16.1M
CPU: 5.859s
CGroup: /system.slice/NetworkManager.service
└─738 /usr/sbin/NetworkManager --no-daemon

nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.0795] device (wlp3s0): supplicant interface state: authenticating>
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.4829] device (wlp3s0): supplicant interface state: associating ->>
nov 08 08:23:40 portatilmdc NetworkManager[738]: <info> [1699428220.8590] manager: rfkill: Wi-Fi hardware radio set disabled

De todas formas, una mejor manera de consultar los mensajes del diario de systemd es con el comando journalctl y la opción --unit, concretamente para el servicio NetworkManager ejecutaríamos:

# journalctl --unit NetworkManager

Podemos listar los servicios que deben iniciarse antes de un determinado servicio, por ejemplo:

# systemctl list-dependencies keyboard-setup.service --after
keyboard-setup.service
● ├─system.slice
● └─systemd-journald.socket

Y también los servicios que deben iniciarse después, por ejemplo:

# systemctl list-dependencies lightdm.service --before 
lightdm.service
● ├─graphical.target
○ │ ├─systemd-update-utmp-runlevel.service
○ │ └─shutdown.target
○ └─shutdown.target

Con respecto a las unidades de servicio de systemd, es importante saber que existen dependencias positivas y negativas entre servicios. Iniciar un servicio en particular puede requerir iniciar uno o más servicios (dependencia positiva) o detener uno o más servicios (dependencia negativa). Cuando se intenta iniciar un nuevo servicio, systemd resuelve todas las dependencias automáticamente y sin notificación explícita al usuario. Si se estuviera ejecutando un servicio y se intenta iniciar otro servicio con una dependencia negativa sobre el primero, este se detiene automáticamente.