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ómocrontab
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 elEnvironment
keys si su script necesita que se definan variables específicas. agregandoset -x
en la parte superior de su script bash y luego ejecutandosystemctl 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, incluidoecho
, o defina explícitamente su $PATH agregandoEnvironment=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.