Cómo ejecutar un proceso al inicio o como servicio en Ubuntu/Linux

Gabolonte Blasfemus

Hace algún tiempo en el post Reconexión automática a VPN en Ubuntu Linux un lector llamado Alejo me consultaba sobre la posibilidad de hacer que el script que se trataba corriese como un demonio o servicio, de manera tal de no tener que preocuparse de ejecutarlo manualmente cada vez. Vamos entonces a ver cuáles son nuestras opciones.

Opción 1: Ejecutar un proceso como demonio o servicio en Linux

Esto es lo que Alejo pedía exactamente, y posiblemente lo más difícil de conseguir. El equivalente de los servicios en Windows, conocidos como demonios en el mundo *nix,  se maneja tradicionalmente a través del proceso Init, heredado del viejo Unix. Pero este sistema con tantos años detrás tenía sus limitaciones, y entonces varias opciones nuevas y más funcionales surgieron. Una de ellas es Upstart, creada originalmente para Ubuntu, pero hoy en día presente en varias distros, ya sea como el reemplazo por defecto del viejo Init o como un opcional.

A los demonios en Upstart les llaman jobs (trabajos), y son definidos por archivos con extensión .conf creados en la ruta /etc/init. Por ejemplo, para crear un servicio llamado “vpn” deberemos crear y editar el archivo de texto /etc/init/vpn.conf

sudo gedit /etc/init/vpn.conf

¿Qué debe contener este archivo para que Upstart lo considere un trabajo válido? Existe una serie instrucciones y ejemplos que se pueden consultar en el fabuloso manual de Upstart, pero siguiendo con nuestro ejemplo para ejecutar un script de conexión a una VPN debería llevar lo siguiente:

description "Conecta a una VPN"

# Start when network-manager starts
start on started network-manager
stop on shutdown

env DISPLAY=:0.0

exec /usr/local/bin/ovpn.sh

La línea description se explica por sí sola y es simplemente un lugar para anotar lo que se supone que debe hacer este trabajo. Precediendo con # una línea podemos agregar comentarios además. Pero la primer instrucción importante la tenemos en start on started network-manager; con ella indicamos que el trabajo debe arrancar solo una vez que se haya iniciado el Network Manager de Gnome; con stop on shutdown le decimos que ni bien se comienza a apagar el equipo debe detenerse. Aunque podría mejorarse para que lo haga cuando no exista una conexión de red disponible para la VPN, ni cableada ni inalámbrica:

start on net-device-up IFACE=eth0
start on net-device-up IFACE=wlan0
stop on net-device-down IFACE=eth0
stop on net-device-down IFACE=wlan0

Con estas 4 líneas indicamos que el servicio solo debe estar activo si existe una conexión activa, ya sea en el adaptador Ethernet o por Wi-Fi, y que de no estar levantado ninguno de los dos se detenga.

Luego encontramos la línea env DISPLAY=:0.0, que es necesaria si el proceso que vamos a ejecutar desde nuestro trabajo necesita del entorno gráfico. Por último tenemos el comando en sí, que lo indicamos con la instrucción exec.

Ahora bien, explicado todo esto les tengo una muy mala noticia con nuestro ejemplo: No nos va a servir para nada; no al menos con Network Manager, ya que es un paquete pensado para sesiones de usuario en un desktop y por ende es muy dependiente de los datos de sesión se usuario, por lo que no podremos conectarlo a una VPN como root, que son los permisos por defecto que posee un trabajo en Upstart. Tampoco tuve éxito utilizando diversas formas de ejecutar el trabajo bajo un usuario específico, pero esto es Linux, yo estoy lejos de ser un experto en el, y tal vez alguien pueda hacerlo.

Ahora, dejando de lado el infortunio con Network Manager, Upstart es, una vez que se lo llega a conocer un poco, realmente fácil y práctico de utilizar. En nuestro hipotético trabajo, suponiendo que nmcli funcionase, no hace falta por ejemplo esperar a que suceda uno de los eventos configurados para que arranque o se detenga, podemos hacerlo manualmente con los comandos start y stop. Por ejemplo, para iniciarlo introduciremos:

sudo start vpn

Y para pararlo

sudo stop vpn

Si queremos consultar el estado de nuestro trabajo, o sea si está en ejecución o no, solo necesitamos ingresar:

status vpn

Si en cambio, queremos consultar el estado de todos los trabajos, los listaremos con:

initctl list

Lista a la que por supuesto podemos filtrar para verla ordenada alfabéticamente:

initctl list | sort

o para buscar uno o un conjunto de trabajos específicos

initctl list | sort | grep network

Pero más allá de la agilidad de Upstart, van a existir casos, como el que vimos, donde no va a ser la respuesta más adecuada para un proceso que queremos que se ejecute continuamente cada vez que iniciamos el equipo, simplemente porque no todos los procesos están preparados para correr como un servicio, cosa que también sucede del otro lado del charco con Windows. Tal vez sea el momento de plantearnos otra forma, y esta es…

Opción 2: Aplicaciones al Inicio

En Gnome/Ubuntu podemos encontrar esta aplicación gráfica fácilmente, desde donde se puede configurar con poca dificultad que programas queremos que se ejecuten, pero no al iniciar el equipo, si no en realidad al iniciar sesión con nuestro usuario. Sería el equivalente a la carpeta Inicio de Windows, solo que al añadir un programa debemos conocer exactamente como se lo invoca desde una línea de comandos (nada que no se pueda averiguar recorriendo el editor del Menú Principal). Convengamos además que para el caso de una VPN persistente en un desktop Linux cumple perfectamente bien su labor.

Esto nos resolvería el problema de ejecutar al inicio el proceso que nuestro ejemplo nos mantendría permanentemente conectados a la VPN de nuestra elección en tanto y en cuanto exista acceso a Internet, y aunque no sea como un servicio o daemon, a todos los efectos de percepción del usuario se comporta como tal una vez que este inició sesión. Pero existen casos especiales en los que el proceso que queramos ejecutar, y que no podamos o queramos hacerlo vía Upstart, necesite permisos de root. Si por ejemplo configuramos en Aplicaciones al Inicio el comando sudo (ó gksu) /home/usuario/proceso.sh nos encontraremos con que se nos solicitará nuestra clave cada vez que iniciemos sesión, sólo para que este script pueda correr. Nada automático, no?

Pero existe una solución a esto, y viene de la mano de editar la lista de sudoers (usuarios con derecho a ejecutar el comando sudo para elevar sus privilegios en situaciones específicas). Editamos esta lista introduciendo:

sudo visudo

Vamos al final del archivo y agregamos la línea:

usuario ALL=NOPASSWD: /home/usuario/proceso.sh

Donde usuario obviamente es nuestro nombre de usuario, y /home/usuario/proceso.sh un ejemplo de la ruta completa al programa o script que queremos ejecutar.

Cerramos (generalmente presionando Ctrl+X si tenemos configurado a visudo para usar el editor nano) y luego guardamos. Vamos a observar luego que al ejecutar este comando con permisos elevados mediante el comando sudo ya no nos pide ninguna clave. Con esto ya podemos agregarlo a la lista de Aplicaciones al Inicio sin más problemas.

Esta entrada está afanosamente inspirada en dos artículos de Greeen Notes, al cual les recomiendo leer, y donde tratan justamente estas dos formas de ejecutar un proceso automáticamente en Ubuntu.


Comments are closed.