• Ejecutar un script al inicio como root

    por  • 23 marzo, 2017 • La sombra del helicóptero • 0 Comentarios

    Ya sabía yo que lanzando al aire mi duda alguien la contestaría y, de paso, todos aprenderíamos algo. El escueto artículo de hoy da respuesta a mi pregunta y soluciona mis problemas con NetworkManager, utilizando a mi “querido” systemd para correr un script al iniciar el sistema, no como usuario normal, sino con privilegios de super-usuario.

    Decía en la entrada de ayer que una de las soluciones que había intentado implementar sin éxito pasaba por tratar de programar un reinicio del servicio NetworkManager, algo necesario para que mi adaptador consiguiese encontrar las redes inalámbricas y, por ende, conectarse a alguna de ellas. En los comentarios al texto un lector, Indian, me facilitaba un par de enlaces a la madre de todas las wikis, la de Arch Linux, en los cuales se trata el tema de los tipos de servicio y los contadores (timers) en systemd. Aspectos que, hasta la fecha, habían pasado desapercibidos para mí dada mi animadversión hacia este paradigma. Mal hecho, por mi parte. Leyendo un poco el primero de los textos, me topé de bruces con la respuesta a mis plegarias.

    Definiendo el objetivo a conseguir

    El comportamiento deseado es el siguiente: tras ponerse en marcha el servicio NetworkManager por primera vez, éste deberá ser reiniciado sin pedir la contraseña del administrador, de modo que el usuario no tenga que intervenir. Esto supone que el script que ejecute la tarea deberá ser lanzado como root.

    Creando el script de bash

    Vamos a implementarlo en el directorio /usr/local/bin, obviamente con root como propietario. Me gusta usar el editor nano, cada cual que utlice el que prefiera:

    sudo nano /usr/local/bin/reiniciar-red.sh

    Le he dado un nombre descriptivo, que nunca está de más. En el interior del archivo, tan solo estas sencillas líneas:

    #!/bin/bash
    
    systemctl restart NetworkManager

    Guardamos con CTRL +  O y salimos con CTRL + X. A continuación, le damos permisos de ejecución con:

    sudo chmod +x /usr/local/bin/reiniciar-red.sh

    Creando un nuevo servicio de systemd

    Comentaba en el artículo anterior que había tratado de ejecutar el script que acabamos de crear como una tarea que debía lanzarse con cada inicio del sistema, empleando para ello el viejo y confiable crontab. Solo durante el primer reinicio se llevó a cabo, fallando en todos los posteriores. Es por ello que lo que haremos será crear un nuevo servicio de systemd que se ejecute tras NetworkManager:

    sudo nano /etc/systemd/system/reiniciar-red.service

    Le he dado el mismo nombre al servicio y al script, pero esto no es obligatorio. En este recién creado servicio vamos a poner lo siguiente:

    [Unit]
    After=NetworkManager.service
    
    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/reiniciar-red.sh
    
    [Install]
    WantedBy=multi-user.target

    La primera de las instrucciones especifica que se debe iniciar tras NetworkManager. Bastante obvio. En la segunda parte encontramos dos líneas: la primera de ellas, que era la que me faltaba en mis anteriores tentativas, indica que se trata de un servicio que se ejecuta una sola vez y punto, no queda residente ni activo. Digamos que lo que corresponde a un script, ni más ni menos. La segunda indica la ruta y el script a lanzar.

    La última parte no la termino de tener muy clara. Parece ser que crea un enlace simbólico al servicio en un subdirectorio (multi-user.target), que supongo que permite que cualquier usuario pueda habilitarlo. Pero no me hagáis mucho caso, porque ya os digo que esta última función no la he entendido del todo. En el intento anterior, dando palos de ciego, utilizaba default.target y en esta ocasión he optado por lo que veis escrito. Ahora funciona y antes no, siento no poder arrojar más luz en el asunto pero hasta aquí llegan mis conocimientos.

    Activando el nuevo servicio

    Y, para finalizar, queda habilitar nuestro servicio reiniciar-red para que se ejecute al inicio del sistema:

    sudo systemctl enable reiniciar-red

    De este modo, una vez realizado todo lo anterior, he acabado con mi problemilla. Ahora, al iniciarse el servicio NetworkManager, automáticamente se invoca el servicio reiniciar-red, que hace lo que su propio nombre indica (es decir, aquello que le hemos pedido que haga). Este doble inicio permite a mi caprichoso adaptador funcionar correctamente.

    Wifi funcionando en Chakra gracias a systemd
    Gracias a systemd, quién me lo iba a decir, he resuelto el problema con mi adaptador inalámbrico en Chakra

    Dejo constancia de los pasos por si a alguien le son de utilidad a la hora de ejecutar cualquier script o aplicación como root al inicio del sistema. Y, de paso, por si en algún momento necesito tirar de estos apuntes porque el problema se reproduzca en Chakra o en cualquier otra distribución GNU/Linux. Estoy seguro de que hay otras maneras de afrontar y arreglar el problema, pero me quedo con la que me ha funcionado y me doy por satisfecho. Después de este ejercicio, systemd y yo nos conocemos un poquito mejor. Qué cosas pasan.

    Salud

    Artículo original: Ejecutar un script al inicio como root

    Deja un comentario

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *