Ejecutar comandos en el arranque de GNU/Linux con systemd

Si tienes que ejecutar un comando cuando se enciende el ordenador, como iniciar manualmente un servicio o hacer un ajuste sobre un driver, puedes orquestarlo con systemd.

En este ejemplo vamos a ver cómo ejecutar un comando, como un script, cuando se enciende el ordenador. El objetivo es que durante el proceso de arranque, se invoque el comando; por ejemplo, que si el comando es un script que debe escribir algo en un archivo, lo haga. Para ello, nos estaremos apoyando en systemd, y crearemos una unidad personalizada que ejecute ese comando durante el arranque.

Esto contrasta con otras formas de ejecutar programas al encender el ordenador, como ponerlo en el autostart de nuestro entorno de escritorio o agregarlo al .bashrc, de que se hará durante el proceso de arranque, así que normalmente se ejecutará mientras el ordenador está iniciando, antes siquiera de que pongamos la contraseña.

Creamos un script de apoyo

En este ejemplo, fabricaré un script auxiliar que será el que defina lo que quiera que ocurra cuando se encienda el ordenador. Para este caso particular, haré que mi script escriba algo sobre uno de los archivos del directorio /sys, una operación típica para modificar el funcionamiento de alguno de los dispositivos de hardware del ordenador.

Crearé un script denominado update-led.sh con el código de mi script:

$ cat > update-led.sh <<EOF
> #!/bin/bash
> echo 1 > /sys/devices/platform/leds/leds/red:standby/brightness
> EOF
$

Como este script requiere ser ejecutado como root, lo pondré en una ubicación más propia del sistema, como /usr/local/sbin, y lo haré ejecutable:

sudo mv update-led.sh /usr/local/sbin/update-led.sh
sudo chmod +x /usr/local/sbin/update-led.sh

Si ahora queremos probar que el script funciona correctamente, lo podríamos ejecutar si es que es una opción en primer lugar.

Invocar el script al arrancar el sistema

Ahora definiré una unidad de systemd que todo lo que tiene que hacer es invocar este script que he fabricado. Para ello crearé un archivo en el directorio /etc/systemd/system, que es donde se colocan las unidades personalizadas de systemd. El archivo podrá tener el nombre que más nos interese, pero deberá terminar por .service. El nombre que le demos, quitando el .service, será como luego será ejecutado mediante systemctl start y similares.

Este archivo tendrá que contener lo que describo más abajo, cambiando las siguientes líneas de interés:

  • Description será cambiado por un comentario sobre qué hace el comando, para identificarlo semanas después, por ejemplo, «arreglo para el driver de red» o «ejecuta rm -rf a .cache».
  • ExecStart será cambiado por la ruta completa al script que hayas creado en tu caso.
[Unit]
Description=Activar el LED

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/update-led.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Este servicio está declarado como oneshot. systemd es bueno ejecutando programas que tienen que estar en marcha todo el tiempo mientras el ordenador está encendido, como el sistema de audio, un agente SSH o GPG… Sin embargo, en este caso le pediremos que ejecute el comando una vez y ya está. La instrucción RemainAfterExit también se usa para señalizar que si el comando termina, todo estará correcto.

Finalmente le pediremos a systemd que active esa unidad, ejecutándola a partir del próximo reinicio. Supongamos que el archivo de unidad se denomina update-led.service, pues el nombre a activar será update-led:

sudo systemd enable update-led

Y opcionalmente si queremos probarlo ya, podemos pedirle que ejecute el script inmediatamente con:

sudo systemd start update-led

¿Qué problemas tiene systemd-oom, el módulo que no entrará en Linux Mint 21?

systemd-oom es un agente que previene que el ordenador colapse cuando se queda sin recursos. Sin embargo, ha sido acusado de ser muy agresivo y por eso algunas distros, como Mint, se niegan a incorporarlo por ahora.

Linux Mint 21 está a poco de ver la luz. Si bien parece que las ISOs de la versión beta de Vanessa, su nombre en clave, van con retraso, no queda mucho para que estas estén disponibles y así se pueda probar la próxima versión del sistema operativo antes de publicarla en el canal estable. En los últimos meses, se han compartido noticias en el blog oficial de Linux Mint haciendo referencia a las novedades que se aportarán en la próxima versión, y una de las más llamativas es el hecho de que Linux Mint 21 no traerá systemd-oom.

systemd-oom es una de las últimas incorporaciones al proyecto systemd. systemd-oom es un agente que monitoriza las aplicaciones en ejecución y que previene que el ordenador agote los recursos de memoria RAM y swap. Si el agente detecta que el ordenador está a punto de quedarse sin memoria para funcionar correctamente y, por lo tanto, de entrar en una situación en la que puede comprometer la estabilidad del ordenador, fuerza el cierre de un árbol de procesos con el objetivo de aliviar recursos.

systemd-oom ha recibido numerosas críticas desde que fue incorporado en Ubuntu debido a su agresividad. Sabemos que cuando se trata de errores de tipo OOM (Out of Memory), el kernel Linux nunca ha sido muy diplomático a la hora de decidir qué procesos en ejecución deben ser eliminados a la fuerza, pero en el caso de systemd-oom, reportan que a veces el agente se activa incluso cuando todavía quedan recursos de sobra, o que a veces trata de cerrar aplicaciones esenciales.

El logo de systemd
systemd es una pieza esencial en cualquier distribución GNU/Linux moderna.

Otras distribuciones también tuvieron sus problemas cuando empezaron a utilizar systemd-oom. En Fedora, está presente desde la versión 34. Desde entonces, algunos reportes de errores han entrado en el gestor de reportes de errores principal advirtiendo de problemas de usabilidad graves. «Hay una aplicación web que uso en Firefox que tiene algún tipo de agujero de memoria. Esto provoca que al cabo de unos minutos, mi escritorio deje de responder y systemd-ood se cargue mi sesión. Puedo o tal vez no puedo volver a iniciar sesión sin reiniciar el ordenador», reportaban hace unos meses en un bug abierto en Fedora 35 que todavía no está marcado como resuelto.

Linux Mint estará basada en Ubuntu 22.04, lo que significa que casi todas las mejoras y cambios de arquitectura que se producen en la distro de Canonical acaban permeando en Linux Mint. Sin embargo, sabemos que históricamente Linux Mint ha sabido moverse cuando algunas de las decisiones de Ubuntu hacen cambios demasiados drásticos y el equipo que está detrás de ella no tiene miedo de hacer modificaciones o cambiar el comportamiento por defecto del sistema, por ejemplo, no utilizando Snap por defecto.

Pues bien, Linux Mint 21 anunció a principios de este mes en su informe mensual que, debido al feedback recibido, no implementarían systemd-oom en la distribución base. Eso significa que el funcionamiento tradicional será el que por defecto determinará qué hacer en caso de agotar los recursos de la máquina, tanto en RAM como en swap, evitando que algunas aplicaciones se cierren inesperadamente. Quedará ver por cuanto tiempo, y si cuando el sistema se perfile y sus errores sean corregidos, lo adoptan al igual que ya han hecho otras distribuciones, o no.