Saltar al contenido

Habilitar rc.local en Systemd

Puede que estuvieras acostumbrado a ejecutar distintos comandos cada vez que se inicia tu maquina. Simplemente agregando comandos a /etc/rc.local.
La mayoría de las distribuciones actuales ahora usan systemd, y por lo general, ya no traen habilitado (y muchas veces ni siquiera soportado) este script.

Habilitando /etc/rc.local

Ejecuta lo siguiente en un terminal :

sudo systemctl status rc-local

Y puede que obtengas el siguiente error :

● rc-local.service - /etc/rc.local Compatibility
 Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled)
 Active: failed (Result: exit-code) since Thu 2015-11-26 23:54:58 CST; 59s ago
 Process: 1001 ExecStart=/etc/rc.local start (code=exited, status=1/FAILURE)
Nov 26 23:54:57 vivid rc.local[1001]: File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 920, in require
Nov 26 23:54:57 vivid rc.local[1001]: needed = self.resolve(parse_requirements(requirements))
Nov 26 23:54:57 vivid rc.local[1001]: File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 807, in resolve
Nov 26 23:54:57 vivid rc.local[1001]: raise DistributionNotFound(req)
Nov 26 23:54:57 vivid rc.local[1001]: pkg_resources.DistributionNotFound: shadowsocks==2.8.2
Nov 26 23:54:58 vivid sudo[1008]: pam_unix(sudo:session): session closed for user root
Nov 26 23:54:58 vivid systemd[1]: rc-local.service: control process exited, code=exited status=1
Nov 26 23:54:58 vivid systemd[1]: Failed to start /etc/rc.local Compatibility.
Nov 26 23:54:58 vivid systemd[1]: Unit rc-local.service entered failed state.
Nov 26 23:54:58 vivid systemd[1]: rc-local.service failed.

O, si intentas habilitarlo :

sudo systemctl enable rc-local

Puedes obtener :

The unit files have no [Install] section. They are not meant to be enabled
 using systemctl.
 Possible reasons for having this kind of units are:
 1) A unit may be statically enabled by being symlinked from another unit's
 .wants/ or .requires/ directory.
 2) A unit's purpose may be to act as a helper for some other unit which has
 a requirement dependency on it.
 3) A unit may be started when needed via activation (socket, path, timer,
 D-Bus, udev, scripted systemctl call, ...).

Como hacerlo funcionar ?

El error indica bien que ocurre, aunque en ingles. Se indica que el «archivo de unidad», que es un archivo que describe como controlar un servicio, no contiene la sección [Install] , por lo que no sabe como usarlo.
Podemos editar el archivo y darle nuevas instrucciones :

sudo vim /etc/systemd/system/rc-local.service

Y pega lo siguiente :

[Unit]
 Description=/etc/rc.local Compatibility
 ConditionPathExists=/etc/rc.local

[Service]
 Type=forking
 ExecStart=/etc/rc.local start
 TimeoutSec=0
 StandardOutput=tty
 RemainAfterExit=yes
 SysVStartPriority=99

[Install]
 WantedBy=multi-user.target

Guarda/Cierra y actualiza el archivo por si no existe :

if [ ! -f /etc/rc.local ]; then sudo echo -e "#!/bin/bash\n\nexit 0" > /etc/rc.local ; fi

Dale permisos de ejecución :

sudo chmod +x /etc/rc.local

Y luego habilita el servicio para cuando se inicie el sistema :

sudo systemctl enable rc-local

Algo así debería mostrar :

Created symlink from /etc/systemd/system/multi-user.target.wants/rc-local.service to /etc/systemd/system/rc-local.service.

Inicia el servicio y chequea el estado :

sudo systemctl start rc-local.service
sudo systemctl status rc-local.service

Salida :

● rc-local.service - /etc/rc.local Compatibility
 Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabled)
 Active: active (running) since Fri 2015-11-27 00:32:56 CST; 14min ago
 Process: 879 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
 Main PID: 880 (watch)
 CGroup: /system.slice/rc-local.service

Alternativa : Usando Cron y @reboot

Si no te gusto la solución anterior, o si no quieres meterte con los servicios, o si solo quieres una solución mas sencilla para ejecutar algo al inicio, puedes usar la opción @reboot de cron. Por ejemplo, si quiero reiniciar httpd luego de iniciar el sistema, se puede hacer así :

sudo crontab -e

Y agrega la siguiente linea al final :

@reboot systemd restart httpd

Guarda y cierra. (Y reinicia si quieres probar)

Chequea que cron este habilitado. Alguna distribuciones lo traen deshabilitado por defecto, y otras usan un nombre distinto para el servicio. Usualmente lo encontraras como «crond» «cron» «crontab» o «cronie».

sudo systemctl enable crond

Y eso es !

Publicado enLinux

Los comentarios están cerrados.

Ivn Systems/Software ©2020