ラベル sleepwatcher の投稿を表示しています。 すべての投稿を表示
ラベル sleepwatcher の投稿を表示しています。 すべての投稿を表示

2013年6月17日月曜日

MacBook Airのフタを閉じたら外付けディスクを自動アンマウント

MacBook Airを取り外して会議に出かけるときや自宅に持って帰る時、ディスプレイのフタを開けたら下の図のようなウォーニングが出ていることがあります。
理由は、MacBook Airのディスプレイを閉じて、その後USBケーブルを抜くのですが、外付けディスクをFinder上で取り出すという操作をしていないためです。
ファイルやディスクが壊れる原因にもなるのですが、急いでいると忘れてしまいます。

持ち運びする時は大概の場合、ディスプレイを閉じるのでスリープ状態になります。ということは、以前Synergyを使う際にインストールしたSleepWatcherが使えそうです。
スリープに入る際に外付けディスクをアンマウントすれば良さそうです。USBを再接続した時は、以前から自動でマウントされていますので、そのままで良さそうです。

現在のMacBook Airの設定では、~/.sleepというshスクリプトファイルにコマンドを書けば良いようにしています。
まず、ディスクがどのような名前でマウントされているか確認します。

$ mount

/dev/disk0s2 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)
map -fstab on /Network/Servers (autofs, automounted, nobrowse)
/dev/disk1s3 on /Volumes/ExFAT (exfat, local, nodev, nosuid, noowners)
/dev/disk1s2 on /Volumes/Backup (hfs, local, nodev, nosuid, journaled)

1本のディスク(/dev/disk1)をパーティション分けして使っていたので、disuutilのunmountDiskコマンドを使うことにします。umountのmanを見ると、diskutilを使えて書いてありました。

~/.sleepに、以下のコマンドを追加して試したところ、うまくいきました。


/usr/sbin/diskutil unmountDisk /dev/disk1 2>&1 | logger


最後のloggerは、システムログにメッセージを出すためです。

2013年1月14日月曜日

Macがスリープした後のSynergyの挙動を直す

前回の記事で書ききれなかった別の問題と解決法について書きたいと思います。

Windows側のマウスのスピードが速すぎる時がある


この現象が起きるのは、Macがスリープしてその後スリープ解除された場合です。スリープ解除後に、マウスをWindowsの画面に持って行くとマウスの移動速度が速すぎて使いづらいのです。
これは、Synergyの設定では対処できないようです。
これの対処には、Sleepwatcherというプログラムを使いました。
Sleepwatcherは、Macがスリープしたりスリープ解除(ウェイク)したりするのを監視して、そのタイミングであらかじめ指定してあるコマンドを実行するプログラムです。
Sleepwatcherは、MacPortsからインストールできます。また、作者のウェブサイトからもダウンロード、インストールできます。
私は、インストールにはMacPortsを使いました。

MacPortsでのインストール

MacPorts自体のインストールの説明は長くなりますので、既にインストールされていることを前提にします。以下のコマンドで簡単にインストールできます。

$ sudo port install sleepwatcher

実行後、sleepwatcherは /opt/local/sbin にインストールされます。

ダウンロード

作者のサイト http://www.bernhard-baehr.de/ からダウンロードできます。私はMacPortsでインストールしたのでプログラムのソースコードは不要だったのですが、設定ファイル(Ploperty Listファイル)の参考にダウンロードしました。

Property Listファイルの作成

SleepwatcherもSynergyと同様にlaunchctl経由で実行・停止の制御をします。そのためには、Property List (plist)ファイルの作成が必要です。一から作成するのは間違いが入る可能性も高くなるので、ダウンロードしたアーカイブファイルに含まれている 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>org.macports.sleepwatcher-localuser</string>
        <key>ProgramArguments</key>
        <array>
                <string>/opt/local/sbin/sleepwatcher</string>
                <string>-V</string>
                <string>-s ~/.sleep</string>
                <string>-w ~/.wakeup</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>KeepAlive</key>
        <true/>
</dict>
</plist>


上記の内容を、~/Library/LaunchAgents/org.macports.sleepwatcher-localuser.plist として保存します。簡単な説明は以下のようです。
ProgramArguments keyにプログラム名と引数の並びをarrayとして定義しています。
-Vオプションはverboseオプションで詳細なログを出力します。
-sオプションでスリープする時に実行されるプログラムを指定しています。
-wオプションでウェイクアップした時に実行されるプログラムを指定しています。
どちらもシェルスクリプトにしています。

次に、.sleepと.wakeupの内容を説明します。
.sleepは #!/bin/sh だけの行で実質的に空ファイルです。
.wakeupは、Synergyを再起動するシェルスクリプト(restart_synergy.sh)を記述しています。

#!/bin/sh
$HOME/bin/restart_synergy.sh

restart_synergy.shの中身は次のようになっています。


#!/bin/sh

PLIST=$HOME/Library/LaunchAgents/org.synergy-foss.org.synergys.plist

if launchctl list | grep -q synergys ; then
    #echo unloading `basename $PLIST` ... 1>&2
    launchctl unload $PLIST
    sleep 1
fi

#echo loading `basename $PLIST` ... 1>&2
launchctl load $PLIST


launchctl listでsynergysが実行されているかどうかを確認し、実行されている場合は一旦停止してからsynergysを再起動します。もともと実行されていなければすぐsynersysを起動します。
また、これらのスリープ、ウェイクアップ用スクリプトファイルに実行用パーミッションを付けておきます。

$ chmod a+x .sleep .wakeup

最後に、launchctlコマンドで起動します。

$ launchctl load ~/Library/LaunchAgents/org.macports.sleepwatcher-localuser.plist

Macをスリープ、解除してWindows側の画面にマウスを持って行ってマウスの速度が通常通りになっていれば成功です。