Saltar al contenido

Debian: ¿cómo ejecutar un script al inicio tan pronto como haya una conexión a Internet lista para usar?

Nuestros investigadores estrellas agotaron sus reservas de café, investigando noche y día por la solución, hasta que César encontró el resultado en Bitbucket así que hoy la comparte con nosotros.

Pon tu guión en /etc/network/if-up.d y hacerlo ejecutable. Se ejecutará automáticamente cada vez que aparezca una interfaz de red.

Para que funcione solo la primera vez que se ejecuta en cada arranque, haga que verifique la existencia de un archivo de marca que crea después de la primera vez. Ejemplo:

#!/bin/sh

FLAGFILE=/var/run/work-was-already-done

case "$IFACE" in
    lo)
        # The loopback interface does not count.
        # only run when some other interface comes up
        exit 0
        ;;
    *)
        ;;
esac

if [ -e $FLAGFILE ]; then
    exit 0
else
    touch $FLAGFILE
fi

: here, do the real work.

Este es un trabajo muy adecuado para systemd.

Ejecutar un script como un servicio systemd

Si su sistema ejecuta systemd, puede configurar su secuencia de comandos para que se ejecute como un servicio de systemd que proporciona control sobre el ciclo de vida y el entorno de ejecución, así como las condiciones previas para iniciar la secuencia de comandos, como que la red esté en funcionamiento.

La carpeta recomendada para sus propios servicios es /etc/systemd/system/ (otra opción es /lib/systemd/system pero eso normalmente debería usarse solo para servicios OOTB).

Cree el archivo, por ejemplo, con sudo vim /etc/systemd/system/autossh.service :

[Unit]
# By default 'simple' is used, see also https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
# Type=simple|forking|oneshot|dbus|notify|idle
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target

[Service]
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=pkill -9 autossh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody

# Useful during debugging; remove it once the service is working
StandardOutput=console

[Install]
WantedBy=multi-user.target

Ahora puedes probar el servicio:

sudo systemctl start autossh

Comprobación del estado del servicio:

systemctl status autossh

Detener el servicio:

sudo systemctl stop autossh

Una vez que haya verificado que el servicio funciona como se esperaba, habilítelo con:

sudo systemctl enable autossh

NOTA: Por razones de seguridad systemd ejecutará el script en un entorno restringido, similar a cómo crontab se ejecutan los scripts, por lo tanto, no haga suposiciones sobre las variables del sistema preexistentes, como $PATH o lo que sea que tenga en su /.bashrc, ~/.zshrc, etc. Utilice el Environment keys si su script necesita que se definan variables específicas. agregando set -x en la parte superior de su script bash y luego ejecutando systemctl status my_service podría ayudar a identificar por qué su secuencia de comandos está fallando. Como regla general, siempre use rutas absolutas para todo, incluido echo, o defina explícitamente su $PATH agregando Environment=MYVAR=abc.

La conexión a Internet aparece mediante una entrada en /etc/rc6.d/ probablemente S35networking. Si cambia ese archivo e inserta sus comandos al final, o mejor agrega un /etc/init.d/mystuff y enlace /etc/rc0.d/S36mystuff e inserte sus comandos allí, entonces eso comenzará tan pronto como la red esté activa.

Si crees que te ha sido útil este artículo, nos gustaría que lo compartas con más entusiastas de la programación de esta manera contrubuyes a dar difusión a nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

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