LoginSignup
2
2

More than 3 years have passed since last update.

Macをスリープ解除で共有フォルダを自動マウント

Last updated at Posted at 2019-05-22

朝会社に来たらまずはメールの確認ですが、その次にはプロジェクトフォルダを弄りたいんです。
が!!!
プロジェクトフォルダが共有フォルダにある場合はマウントしないと弄れないんです。

mountコマンドを起動時に走らせればいい

一時はこれで解決したかと思ったのですが、スリープ解除後にアンマウントされていることがよくあるんですよね。
今回はこれを解決したいです。

使うプログラム

  • Launchd
  • SleepWatcher
  • AppleScript

SleepWatcherでスリープ解除を検知し、マウントスクリプトを走らせる
簡単なお仕事です。

まずはSleepWatcherをインストール

とその前に、SleepWatcherとはなんぞやということですが、
「Macのスリープ/スリープ解除イベントを検知してプログラムを呼び出す」
というものです。

ここからしばらく以下のサイトをほぼ丸パクリしています。
https://blog.ishkawa.org/2018/11/09/1541697110/

インストールは簡単にbrew


brew install sleepwatcher

SleepWatcherを常駐させる

LaunchAgentに登録することで常に実行できるようです。
ということで下記コマンドを実行してファイルとディレクトリを用意します。

mkdir -p ~/Library/LaunchAgents
cp /usr/local/opt/sleepwatcher/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist

設定ファイルを見てみましょう。

cat ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.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>-s ~/.sleep</string>
        <string>-w ~/.wakeup</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

一言で言うと、スリープするときに「~/.sleep」が、スリープ解除するときに「~/.wakeup」が実行されます。
なので上記2つのファイルを作って実行権を与えておきましょう。

touch ~/.sleep ~/.wakeup
chmod +x ~/.sleep ~/.wakeup

これでファイル構成の準備は整いました。

ここまで以下のサイトをほぼ丸パクリしています。
https://blog.ishkawa.org/2018/11/09/1541697110/

あとはLaunchAgentが読み込めるように登録します。

launchctl load ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist

マウント用のスクリプトを書く

ここまででスリープ/スリープ解除時に自動的にスクリプトを実行する環境が整いました。
続いてはスリープ解除時にマウントするスクリプトを書きます。
シェルスクリプトが極めて苦手なので、AppleScriptを使っています。

vim ~/automount.scpt
on run argv
    if (count of argv) > 0 then
        delay (item 1 of argv) as integer
    end if
    try
        mount volume "smb://マウントしたいパス1"
        delay 1
        mount volume "smb://マウントしたいパス2"
        delay 1
    end try
end run

このスクリプトはコマンドライン引数で数値を与えると、その秒数後にマウント処理を実行します。後ほど使い道を解説します。
マウントしたいパスは必要に応じて増減できます。
マウントの間のdelayはいわゆるsleep命令なのですが、念の為入れているのだけなので不要かもしれないです。

最後にこいつを.wakeupから呼び出せるようにします。

vim ~/.wakeup
osascript ~/automount.scpt 120

これでスリープ解除して120秒後にマウント処理を開始します。
やりましたね!

なぜ120秒後かと言うと、スリープ解除直後ってWi-Fiを掴んでいないことが多いんですね。
なので掴むまでの時間としてを120秒待つようにしています。
環境に応じて変更してください。

おまけ

osascript ~/automount.scpt

このようにコマンドライン引数をつけずに実行すると即座にマウントを開始します。
たまにスリープ解除後にWi-fiを掴めなかったり、なぜかアンマウントされてしまったときにすぐ実行できると便利です。
でもいちいちこのコマンド打つのは面倒なので、私はパスの通ったディレクトリにこんなスクリプトファイルを置いています。

vim ~/bin/allmaunt # ~/bin/はパスが通っている前提です
#!/bin/sh
osascript ~/automount.scpt

これでパスを覚えることなく、以下コマンドですぐにマウントできるようになります。

allmount

ならスリープ解除後に自動マウントいらなくね?
と思うかもしれませんが、何事も自動化できることは自動化したほうがいいのです。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2