在网络连接或重新连接时启动以运行任务

时间:2015-05-10 22:26:17

标签: macos osx-yosemite launchd launchctl

我运行一个自定义python脚本来通过launchctl更新各种动态DNS服务器,它每15分钟运行一次。这既是矫枉过正又有不足之处。

如果脚本仅在可达性发生变化时执行,那么这将是很好的,然后可能每30分钟执行一次后备。在调用更新之前,我可以很容易地更新Python脚本以检查外部地址是否已更改,但如果我的连接断开并且备份了不同的IP地址,我不想等待15-30分钟

请注意,这与keep alive参数不同。赔率是我的电脑永远不会丢失其网络连接。它在局域网上,一切都有备用电源。因此,只有互联网可达性才重要。

1 个答案:

答案 0 :(得分:1)

我不认为launchd有任何内置的网络触发器,但你可以监控文件路径的变化。因此,如果我们能够找到在网络连接时更新的文件,我们就可以实现所需的功能。

一个这样的文件是/var/run/resolv.conf - 只要计算机更新DHCP租约,就会写入此文件。它将在您第一次连接时更新,并在更新DHCP租约时定期更新(时间由DHCP服务器设置)。

这是一个示例launchd plist文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>org.example.on-dhcp-renew</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/darrin/bin/on-dhcp-renew.sh</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/var/run/resolv.conf</string>
    </array>
</dict>
</plist>

这仅适用于LAN的DHCP寻址 - 因为DHCP客户端是更新resolv.conf文件的程序。