11月25日
「ディスクの不正な取り出し」警告対策:Sleep/Awakeを検出してUSB HDDをunmount/mountする
MacBook Pro RetinaにUSBハブを接続し、作業しています。
USBハブには、以下製品を接続しています。
作業している間、不満は特にありません。
MacBook Pro RetinaがSleepモードに入っている状態で、MacBook Pro Retinaを持ち出したり、
別の場所へ移動させようとUSBハブを抜くと
当然ながら「ディスクの不正な取り出し」警告が表示されます。
電源を入れて、ディスクの取り出し操作をすれば警告は表示されませんが、毎回面倒な手順だと感じ始めていました。
Sleep、特に作業しているわけではありません。
作業している間は、バックアップしてほしい、
MacBook Pro RetinaがSleepしている間はいつでもUSBハブを抜いていい状態にしておきたい
という欲望がでてきました。
Sleep状態に入ることを察知したら、diskutil umount でUSB HDDをいつでも抜ける状態にする
自分でMacを起動、diskutil mount でバックアップ可能な状態にする
やりたいことは非常に単純です。
これが大きな問題です。
単純に実現するならAppleScriptです。AppleScriptでSleep/Awakeを検出できるのか
USBハブには、以下製品を接続しています。
- バックアップ用USB HDD
- USB キーボード
- USB マウス
作業している間、不満は特にありません。
MacBook Pro RetinaがSleepモードに入っている状態で、MacBook Pro Retinaを持ち出したり、
別の場所へ移動させようとUSBハブを抜くと
当然ながら「ディスクの不正な取り出し」警告が表示されます。
電源を入れて、ディスクの取り出し操作をすれば警告は表示されませんが、毎回面倒な手順だと感じ始めていました。
Sleep、特に作業しているわけではありません。
作業している間は、バックアップしてほしい、
MacBook Pro RetinaがSleepしている間はいつでもUSBハブを抜いていい状態にしておきたい
という欲望がでてきました。
実現したいこと
Sleep状態に入ることを察知したら、diskutil umount でUSB HDDをいつでも抜ける状態にする
自分でMacを起動、diskutil mount でバックアップ可能な状態にする
やりたいことは非常に単純です。
どうやってSleep/Awakeを検出するのか
これが大きな問題です。
単純に実現するならAppleScriptです。AppleScriptでSleep/Awakeを検出できるのか
調べてみると、AppleScriptでの検出は難しそうです。
Power ManagerやSleepWatchなるものがあるようです。
探している中で、IORegisterForSystemPowerなるAPIを知りました。
どうやら簡単に自分で作れそうな予感がしてきました。
ソース等は、githubに登録してみました。
https://github.com/macyarounanoka/PowerNotifyd
~/Library/LaunchAgentsフォルダにplist形式のファイルを置くことで、自分がログインしている間に自動実行・自動停止するプログラムを制御できます。
また、launchctlコマンドでloadすることで強制的に開始状態にできます。
install.shを実行するとこのあたりの制御を実行します。
システムがスリープに入る前に呼び出されるスクリプトです。
アンマウントするコマンドを登録します。
vi ~/PowerNotifyd/scripts/SystemWillSleep
#!/bin/sh
diskutil umount /dev/disk2s2
(viの代わりにテキストエディタ等で編集しても構いません)
/dev/disk2s2は、USB HDDデバイスを意味しています。(Mac野郎なのかの環境)
接続している数で変化するので、USB HDDを接続した状態で以下dfコマンドを実行して調べてください。
$ df
Mounted onにラベル名があります。これでHDDを特定して、Filesystem項目の/dev/disk?s?を選定します。
システムが起動完了状態になると呼び出されるシェルスクリプトです。
マウントするコマンドを登録します。
vi ~/PowerNotifyd/scripts/SystemHasPoweredOn
#!/bin/sh
diskutil mount /dev/disk2s2
(viの代わりにテキストエディタ等で編集しても構いません)
起動は、install.shがエラーなく完了している時点で終了しています。
$ launchctl list | grep PowerNotifyd
local.PowerNotifydが見つかるはずです。見つかる場合は、実行中の証です。
/var/log/system.logにもstart、及びSleep/Awakeイベントで実行が記録されるようになっています。
Sleep状態になるとUSB HDDがアンマウントされ、いつでもUSBハブが抜ける状態になりました。
MacBook Pro Retinaを起動するとUSB HDDがあればマウントされるようになりました。
Power ManagerやSleepWatchなるものがあるようです。
探している中で、IORegisterForSystemPowerなるAPIを知りました。
どうやら簡単に自分で作れそうな予感がしてきました。
Sleep/Awakeを検出してShellScriptを呼び出すPowerNotifyd
ソース等は、githubに登録してみました。
https://github.com/macyarounanoka/PowerNotifyd
~/Library/LaunchAgentsフォルダにplist形式のファイルを置くことで、自分がログインしている間に自動実行・自動停止するプログラムを制御できます。
また、launchctlコマンドでloadすることで強制的に開始状態にできます。
install.shを実行するとこのあたりの制御を実行します。
PowerNotifyd/scripts/SystemWillSleep
システムがスリープに入る前に呼び出されるスクリプトです。
アンマウントするコマンドを登録します。
vi ~/PowerNotifyd/scripts/SystemWillSleep
diskutil umount /dev/disk2s2
(viの代わりにテキストエディタ等で編集しても構いません)
/dev/disk2s2は、USB HDDデバイスを意味しています。(Mac野郎なのかの環境)
接続している数で変化するので、USB HDDを接続した状態で以下dfコマンドを実行して調べてください。
$ df
Mounted onにラベル名があります。これでHDDを特定して、Filesystem項目の/dev/disk?s?を選定します。
PowerNotifyd/scripts/SystemHasPoweredOn
システムが起動完了状態になると呼び出されるシェルスクリプトです。
マウントするコマンドを登録します。
vi ~/PowerNotifyd/scripts/SystemHasPoweredOn
diskutil mount /dev/disk2s2
(viの代わりにテキストエディタ等で編集しても構いません)
起動
起動は、install.shがエラーなく完了している時点で終了しています。
$ launchctl list | grep PowerNotifyd
local.PowerNotifydが見つかるはずです。見つかる場合は、実行中の証です。
/var/log/system.logにもstart、及びSleep/Awakeイベントで実行が記録されるようになっています。
とりあえず目的は達成
Sleep状態になるとUSB HDDがアンマウントされ、いつでもUSBハブが抜ける状態になりました。
MacBook Pro Retinaを起動するとUSB HDDがあればマウントされるようになりました。
コメントシステムを利用したくない方はお問い合わせからお願いします。
2013.8.19 DISQUS(外部コメントサービス)の利用を開始しました。
Facebook, google, Twitter等のアカウントで投稿可能です。