macOSでネット切替時にスクリプトを自動実行する方法

macOSでネット切替時にスクリプトを自動実行する方法です

  • IPアドレスが変わった場合に ssh を再接続したい
  • wifiが途切れたらプロセスをkillしたい
  • wifiが再接続されたらプログラムを自動起動したい

といった場合に利用できます

動作原理

起動したいコマンドを /path/to/reconnect.sh とします

macOSはネットワークの構成が変わるとDNSを再設定します
例えば

  • DHCPIPアドレスを取得した場合
  • wifiをOffにしたためネットワークが切断された場合
  • LANケーブルを抜いた場合,差した場合

は,DNSが再設定されます

DNSの設定はファイル /etc/resolv.conf に保存されます.つまりネット切替時は,ファイル /etc/resolv.conf のタイムスタンプが更新されます.

そこでファイルのタイムスタンプを監視し,タイムスタンプが更新されたら コマンド /path/to/reconnect.sh を実行する,という設定を launchd に登録します.

launchd の設定

plist ファイルの作成

以下の内容で ~/Library/LaunchAgents/reconnect.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>/path/to/reconnect.sh</string>
  </array>
  <key>WatchPaths</key>
  <array>
    <string>/var/run/resolv.conf</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

/path/to/reconnect.sh の部分は適宜修正してください.ここで起動したいスクリプトをフルパスで指定します

構文のチェック
$ plutil -lint reconnect.plist 
reconnect.plist: OK

"OK"と表示されることを確認

動作確認

動作確認は launchctl コマンドで行います

load で登録,

$ launchctl load ~/Library/LaunchAgents/reconnect.plist 

unloadで登録解除です

$ launchctl unload ~/Library/LaunchAgents/reconnect.plist 

なおLoad済みの状態で,再度 launchctl load すると「Load failed: 5: Input/Output error」のエラーがでます

自動登録

設定は不要です

設定ファイルで RunAtLoad を指定しているので,ログイン時に自動で loadされます