Yukarıda belirtilen sorunu çözmek için launchd kullanmaya çalışıyorum.
networkchange.plist
Aşağıdaki gibi bir dosya var :
<?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>*some path*/networkchangeaction.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>
Kullanılması sudo launchctl load -w /Library/LaunchDaemons/networkchange.plist
kendisine taşıdıktan sonra ben Kablosuz ağlar arasında geçiş yaparken benim bash komut dosyası sadece iyi çalıştırır yerdir.
Benim networkchangeaction.sh
betiğim:
#!/bin/bash
lock="/tmp/networkchange.lock"
triggerssid="someSSID"
macaddress="7c:c5:d7:f2:09:23"
ssid=$(networksetup -getairportnetwork en0 | awk -F": " '{print $2}')
if mkdir "$lock"; then # my attempt at solving the infinite call loop
trap 'sudo rm -rf "$lock"' 0 # $lock is kinda like a mutex
if [ "$ssid" == "$triggerssid" ]; then
sudo ifconfig en0 ether $macaddress # change MAC address
sudo ifconfig en0 down # restart wifi interface
sudo ifconfig en0 up
sleep 2 # wait for it to restart, then join $triggerssid
sudo networksetup -setairportnetwork en0 $triggerssid *wifi wpa2*
fi
else
exit 0
fi
Benim sorunum, MAC adresini değiştirdikten sonra betiğin ağa tekrar katılmasından dolayı sonsuz olarak adlandırılmasıdır. Bunu bir "muteks" ile çözmeyi denedim ( burada önerildiği gibi ), böylece bu betiğin yalnızca bir örneği bir seferde çalışabilir, ancak yine de sürekli olarak çağrılır.
Senaryonun kendisini tetiklememesi için bu problemi nasıl çözebilirim ?
Komut dosyasının sürekli olarak (tekrar tekrar) çağrılması, paralel yürütmeyi önlemek için bir muteks kullanmaktan farklıdır. Burada hangi problemi çözmeye çalışıyorsun?
—
nohillside
Ayrıca çalıştırmanın
—
yokuş yukarı
ifconfig
, betiği tekrar tetikleyen izlenen dosyaların bazılarını değiştireceğini varsayardım .
@ patrix soruyu açıklığa kavuşturdu. Sorun kesinlikle senaryosunun kendisini tetiklemesidir. İlk örnek hala çalışırken fırlatma komutunun çağrıldığını ve bu nedenle muteks çözümünü denedim.
—
krispet krispet