現在*1所有している2台のMacには、NASにある共有フォルダをマウントするために接続しているネットワークの変化をトリガとしてシェルスクリプトを実行する設定を施してあります。
GUIのOSを使用しながら、しち面倒なシェルスクリプトで機能を実装することにした経緯をまとめました。
NASの用途
自宅のネットワークに設置しているファイルサーバ用のNASです。
NASといえば、信頼性と性能を重視して複数のディスクでRAID1または5を構築できるモデルがまず頭に浮かびますがTS-131Pは1ベイのモデルです。
NASの用途は、
- Adobe Lightroom Classicのライブラリ
- 写真のネガ、過去の写真
- iTunesのメディアフォルダ
- 機器の取扱説明書そのほか自身でスキャンした雑誌の記事等々おもにPDFドキュメント
- macOSのTime Machineのバックアップディスク
- iPhone, iPadのバックアップ
おおまかにはこんなところです。
Time Machineのバックアップディスク以外のファイルは週に数回の更新頻度で、定期的にUSB接続のポータブルディスクにコピーを行っています。
1ベイのモデルを選んだ理由は、もしNASのディスクが故障して使用不可になったとしても、1週間程度の停止*2であれば支障はないだろうと考えたからです。
使用しているプロトコルはAFPとSMBです。
Time MachineはAFPを使用して、共有フォルダはSMBでアクセスします。
最近はSMBが推奨されている様子ですが、FinderのSMBコンピュータがあんまりなアイコン*3 で表示されますが、ここはこらえることにしています。
NASの共有フォルダの扱い
NASにある個人用の共有フォルダ*4にアクセスする頻度はそれほど多くはありませんのであらかじめマウントしておく必要はありませんが、Adobe Lightroomだけが起動する都度ライブラリを選択しなければならない*5ことと、最近ターミナルを使用することが多くなっているので、それならユーザのログイン時にホーム下のフォルダにマウントすることにして方法を調べてみました。相変わらずgoogle先生です。
その前に再確認
どんな動作を期待するのか
ログイン時にマウントすることは最低限実現したいことで、さらに期待するのことは*6、指定した共有フォルダが見つかったときに接続するという動作です。
共有フォルダをマウントする方法を検討する
macOSで共有フォルダを利用者の操作なしでマウントする方法はおおよそ次の3つでしょうか
それぞれの方法に一長一短があるとはず、まずいちばん手軽な1.の方法を試してみます。
それぞれの方法について検討する
1.ユーザのログイン項目に共有フォルダを追加する
macOSの機能を使うので、もっとも手早い方法です。
しかし、ログイン後にフォルダがどーんと表示されます。そして、既にマウントされていると共有名の末尾に-1, -2といった文字列が付加されてマウントされるのでAdobe Lightroom Classicの起動時の問題は解決できません*7。また、ログイン後に共有ドライブが見つかったときには機能しません。
ですので、この方法は選外(´・ω・`)。
2.automatorでフォルダアクションを作成する
ネットワーク環境が変化したときに監視するフォルダはmacOS バージョン10シリーズでは "/Library/Preferences/SystemConfiguration"のようです。
このフォルダにはネットワークの設定以外にもシステム環境設定に関わるplistファイルがいくつかあるので監視する対象としては範囲が広すぎます。従って、この方法も選外(´・ω・`)
3.Apple Scriptかシェルスクリプトでプログラムを書く
GUIから実行するのであればApple Scriptが選択肢。
ですが、今回のテーマではmountコマンドを発行するなどUNIXの色濃い処理ですのでシェルスクリプトを選択します。久しぶりです。
今はMicrosoft社が無償で公開しているVisual Studio CodeというIDEとまではいかないまでもエディタを中心にターミナルまで1画面で実行できるツールがあるんですね。このツールはインストールしてみて一目で気に入りました。
しかし、…*8
launchctlというコアな機能の助けを借りる
さて、シェルスクリプトで処理を書くまでは決めたのですが、フォルダの監視とシェルスクリプトの起動はどんな方法があるのか、crondを使うのかなとまたまたgoogle先生に訊いてみたところ、macOSで laucnd というサービス管理フレームワークを使うとのこと。これだと特定のファイル監視が可能ですし、stdOut, stdErrのパスも記述できるようなので期待している動作を実現できそうです。
ということで、だいたいできそうな目処が立ったので実装を始めることにします。
後編中編に続く
念のため
あくまで自己責任でお願いします。
謝辞
いくつかの記事を参考にさせていただきました。御礼申し上げます。