Mac

Mac のスリープ/復帰時にスクリプトを実行する

sleepwatcher を利用すれば,Mac のスリープ/スリープ復帰時にスクリプトを実行することができる.

  • 研究室・自宅間で移動する度に手動でネットワーク環境を切り替えるのが面倒なので,復帰時に接続しているアクセスポイントに応じて自動で切り替わるようにする.
  • ディスクの取り出し操作をせずにバックアップ用のディスクが接続されたハブを抜くと不正な取り出しになってしまうので,スリープ時にアンマウントする.

スリープ/復帰時に実行したいスクリプトを作成する

ネットワーク環境を切り替える shell script を作成

Users/hogetaro/Scripts/network-environment_auto-switcher.sh
#!/bin/sh
switchtolocation() {
  currentlocation=`networksetup -getcurrentlocation`
  if test $currentlocation = $1; then
    return
  fi
  scselect `scselect|grep ${1}|cut -b 4-40`
  osascript -e 'display notification "'"ネットワーク環境を「${1}」へ変更しました。"'" with title "'"${0##*/}"'" subtitle "'"${2}"'"'
}

ADAPTER=en0

sleep 5s

airportpower=`networksetup -getairportpower ${ADAPTER}|cut -d' ' -f4`
if test ${airportpower} = 'Off'; then
  echo 'Wifi is Off.'
  exit
fi

ssid=`networksetup -getairportnetwork ${ADAPTER}|cut -d':' -f2|cut -b 2-`
case "$ssid" in
  [自宅のSSID])
    switchtolocation [自宅のネットワーク環境名] ${ssid}
    ;;
  [会社のSSID])
    switchtolocation [会社のネットワーク環境名] ${ssid}
    ;;
  *)
    switchtolocation Automatic ${ssid}
    ;;
esac
  • ファイルの置き場所はどこでも.
  • アダプター名(ADAPTER=en0)の部分は,「このMacについて>システムレポート>ネットワーク>Wi-Fi」で確認したインターフェース名とする.
  • 自分のSSID,ネットワーク環境名に編集する.[]は外す.
  • sleep 5sで,端末がwifiネットワークに接続する前にスクリプトが走らないようにする.待機時間は適当なので調整してください.

ディスクをアンマウントする shell script を作成

Users/hogetaro/Scripts/disk_unmounter.sh
#!/bin/sh
diskutil unmount [diskname]

実行権限を付与

$ chmod u+x network-environment_auto-switcher.sh
$ chmod u+x disk_unmounter.sh

sleepwatcher の設定

sleepwawtcher をインストール

sleepwatcher を利用すると,スリープ前,復帰後にスクリプトを走らせることができる.

$ brew install sleepwatcher

LaunchAgents 下にファイル作成

Users/hogetaro/Library/LaunchAgents/before-sleep_after-awake.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>de.bernhard-baehr.sleepwatcher</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/sbin/sleepwatcher</string>
        <string>-V</string>
        <string>-w /Users/hogetaro/Scripts/network-environment_auto-switcher.sh</string>
        <string>-s /Users/hogetaro/Scripts/disk_unmounter.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>
  • -w以降が復帰(Wake Up)時に実行するコマンド
  • -s以降がスリープ(Sleep)時に実行するコマンド

launchd に登録

$ launchctl load [path/]before-sleep_after-awake.plist

参考