Ejecutar un comando durante el arranque de la máquina
En las distribuciones de GNU/Linux actuales el arranque está controlado por systemd, pero antes de su desarrollo se utilizaba mayormente el estilo de arranque de System V con sus niveles de ejecución. Todo ese mundo antiguo ha sido reemplazado por systemd que ofrece múltiples ventajas y características nuevas pero aún queda un vestigio del pasado que resulta muy práctico.
El fichero /etc/rc.local
En el antiguo estilo de arranque de System V el fichero /etc/rc.local
era un script que se ejecutaba al completarse el arranque.
Por ejemplo un fichero /etc/rc.local
en el que se activa el NAT en una interfaz de red puede ser:
#!/bin/bash
iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
exit 0
Así el administrador podía escribir allí los comando que quería que se ejecutasen automáticamente una vez que la máquina hubiera arrancado.
Compatibilidad de systemd: rc-local.service
Esta función tan práctica no tiene equivalente directo en el mundo de systemd, pero systemd-rc-local-generator
se encarga de proporcionar compatibilidad con el antiguo fichero /etc/rc.local
.
Cuando arrancamos con systemd se comprueban dos condiciones:
- Que exista el fichero
/etc/rc.local
. - Que sea un fichero ejecutable.
Si se cumplen estas condiciones se generará la unidad rc-local.service
que ejecutará el script cuando se alcance network.target
(en paralelo con el resto de unidades).
Así es suficiente con crear el fichero /etc/rc.local
con permiso de ejecución y escribir en su interior para tener un comportamiento similar al sistema antiguo.
Como ejemplo, en Ubuntu 22.04 la unidad rc-local.service
generada contiene:
[Unit] Description=/etc/rc.local Compatibility Documentation=man:systemd-rc-local-generator(8) ConditionFileIsExecutable=/etc/rc.local After=network.target [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 RemainAfterExit=yes GuessMainPID=no
La página de manual de systemd-rc-local-generator
nos advierte de que esta es una función de compatibilidad con el sistema tradicional y no una manera de lanzar servicios. Para lanzar servicios será necesario crear la unidad que los controla.