¿Por qué los comandos posteriores en / etc / network / interfaces se ejecutan varias veces en el arranque?

10

Aquí está el contenido de /etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

post-up /etc/network/if-up.d/sshstart

Y sshstartes un script con lo siguiente:

curl something something darkside send a file over ftps in the background &
/usr/bin/autossh -M 0 -f -N -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -R 127.0.0.1:2005:127.0.0.1:22 -R 192.168.1.10:2006:192.168.2.110:1912 -L 127.0.0.1:5249:192.168.1.212:5249 [email protected] -p 8080

Cuando la máquina se reinicia, el curlcomando se ejecuta varias veces, el archivo termina 2 o 3 veces en el servidor ftp y cuando miro los procesos parece que hay varias instancias de autossh ejecutándose ... No estoy seguro de si así es como autossh hace cosas o no, pero seguramente curl no debería cargar el archivo varias veces.

Mi presentimiento es que todo el sshstartscript se ejecuta varias veces, pero no entiendo por qué.

Intenté buscar detalles sobre el proceso de configuración de la red en el arranque, pero todo lo que pude encontrar fue información de sintaxis para el archivo de interfaces.

¿Puede alguien ayudar, por favor?

Gracias.

--- Editar ---

Como se sugiere a continuación, modifiqué mi archivo de interfaz de la siguiente manera (eliminé las líneas vacías que aparecen arriba de la publicación):

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
post-up /etc/network/if-up.d/sshstart

Y agregó la siguiente línea a sshstart:

echo $(date)>>/run/shm/sshstart.log

Aquí está el contenido de /run/shm/sshstart.logdespués de un reinicio:

Wed Oct 29 08:07:00 EDT 2014
Wed Oct 29 08:07:07 EDT 2014
Wed Oct 29 08:07:07 EDT 2014
Wed Oct 29 08:07:07 EDT 2014

Así que se ejecutó 4 veces :( ¿qué está pasando?

TCZ8
fuente
1
Sugerencia: lo establece if-up.d en verdadero, y eth0 también lo establece en verdadero. La publicación posterior se ejecuta después de configurar cada una. Su script debe depender de que solo 1 interfaz esté activa, no ambas.
eyoung100
Pensé que podría ser algo así, supongo que es hora de RTFM un poco más.
TCZ8
He revisado y no puedo encontrar cómo especificar qué adaptador para el comando posterior, parece tener algo que ver con una "estrofa", pero no lo entiendo exactamente. La página de interfaces de Debian y Ubuntu tiene mucha información, pero omitieron esa parte.
TCZ8
1
No está relacionado con la pregunta, pero por cierto echo $(date)es un poco incómodo e indirecto. También podría deletrear eso como date. Similar al Premio de Uso Inútil del Gato .
Celada
¡jajaja! ¡tienes toda la razón! No tengo idea de por qué he hecho eso: P
TCZ8

Respuestas:

13

Los archivos /etc/network/if-up.d ya se ejecutan automáticamente cada vez que aparece una interfaz (cualquier interfaz). Cuando especifica el mismo script para ejecutar nuevamente en un post-upcomando explícito , solo hace que el script se ejecute nuevamente. Entonces, supongo que esto es lo que debería suceder:

  • Se ejecuta una vez cuando loaparece (con variable de entorno IFACE=lo) debido a que se encuentra en /etc/network/if-up.d.
  • Se ejecuta una vez cuando eth0aparece (con variable de entorno IFACE=eth0) por la misma razón.
  • Se ejecuta de nuevo cuando eth0aparece (con la variable de entorno sin IFACEconfigurar) porque lo solicitó en una post-updirectiva.

No estoy seguro de dónde viene la cuarta vez, pero de todos modos ya son tres.

Debe ubicar el script en otro lugar y ejecutarlo una vez usando una post-updirectiva, o dejarlo donde está pero no mencionarlo en una post-updirectiva y verificar el valor de $IFACEpara que no haga nada a menos que la interfaz deseada ( eth0) haya llegado arriba.

Celada
fuente
OHH MAN! ¡Finalmente! tienes toda la razón, ¡acabo de agregar una línea a sshstart para hacer eco de $ IFACE en mi archivo de registro y es exactamente como lo describiste! La 1ra vez es lo, la 2da vez es eth0, la 3ra es eth0 nuevamente (desde el post-up) y la 4ta vez no está tan clara. El valor de $ IFACE en la 4ta vez es: --todos no sabrías qué ¿medio? Solo por curiosidad :)
TCZ8
1
No sabía acerca --all. Parece que hay una característica para ejecutar las if-up.dsecuencias de comandos por última vez con este argumento para indicar que todas las interfaces están ahora activas, en caso de que alguna secuencia de comandos quiera realizar una acción una vez que se sepa que no hay más interfaces pendientes. Eso explica la cuarta vez.
Celada
Eso tiene sentido, gracias por toda su ayuda!
TCZ8
3

Como dijo Celada, los /etc/network/if-up.dscripts se ejecutan para cada interfaz. Para evitar la duplicación de reglas, simplemente agregue:

[ "$IFACE" = "eth0" ] || exit 0

en la parte superior de tu guión. Esto hará que el script salga inmediatamente si la interfaz no es la deseada.

ppparadox
fuente
1

Elimine la línea vacía antes del post-upcomando. Esto debería relacionar el post-upcomando eth0únicamente. Además, mueva su script fuera de la if-up.dcarpeta. Las secuencias de comandos en esa carpeta se ejecutan automáticamente, sin importar si se definen como post-up. En su caso, se ejecutará adicionalmente a su post-upcomando.

xx4h
fuente
No funciona, vea la edición en mi pregunta.
TCZ8