¿Hay una manera de ejecutar un script cada vez que una interfaz de red termina de aparecer? O, ¿hay una respuesta equivalente a esta pregunta de Debian en OSX?
¿Hay una manera de ejecutar un script cada vez que una interfaz de red termina de aparecer? O, ¿hay una respuesta equivalente a esta pregunta de Debian en OSX?
No he probado esta solución por mi cuenta, pero encontré este hilo: enlace
Debería considerar el uso de crankd , que le permite ejecutar scripts en respuesta a muchos eventos del sistema, como cambios de red, sistemas de archivos. actividad, lanzamiento de aplicaciones, etc.
Como no pude encontrar ninguna documentación razonable, también escribí una pequeña publicación en el blog comenzar a usar crankd .
Lo siguiente funciona en Mac OS X 10.11.3 (El Capitán)
crea un archivo: networkchange.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>networkchange</string>
<key>LowPriorityIO</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/Users/Shared/bin/networkchange.sh</string>
</array>
<key>WatchPaths</key>
<array>
<string>/etc/resolv.conf</string>
<string>/var/run/resolv.conf</string>
<string>/private/var/run/resolv.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Y registrarlo con:
launchctl load networkchange.plist
launchctl start networkchange
tenga en cuenta que la secuencia de comandos es ejecutada por el usuario que registra el plist.
Un agente de launchd que mira /etc/resolv.conf
, y dos archivos .plist relacionados con la red bajo /Library/Preferences/SystemConfiguration/
parecen funcionar para mí (en Mac OS X 10.8.4):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>ifup.ddns</string>
<key>LowPriorityIO</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/Users/Shared/bin/ddns-update.sh</string>
</array>
<key>WatchPaths</key>
<array>
<string>/etc/resolv.conf</string>
<string>/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist</string>
<string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Anteriormente solo había usado /etc/resolv.conf, pero había casos en los que eso no era suficiente.
He terminado con este script:
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
let COUNTER=COUNTER+1
# assign to test at each iteration otherwise the output won't be changed
test=$(ifconfig -a inet 2>/dev/null | sed -n -e '/127.0.0.1/d' -e '/0.0.0.0/d' -e '/inet/p' | wc -l)
if [ "${test}" -gt 0 ]; then
# do the job here
# exit the loop
let COUNTER=COUNTER+10
break
fi
# give a little time for a network to get up
sleep 2
done
Comprueba una red 10 veces y la red tiene 2 * 10 segundos para levantarse.