macOS High Sierra でのお話。

作業中に Tima Machine が動き出すと、macOS が重くなったり固まったり
するので、長年プチイライラしていました。

TimeMachineScheduler というアプリを使ったら、当初は調子が良かった
のですが、最近はうまく実行してくれません。なぜだ…。

AppleScript + launchd で定期実行出来ないかな?とふと思い立ちました。

調べたら AppleScript を使わずとも /usr/bin/tmutil がありました。
Time Machine CLI です。’$ man tmutil’ で詳しいヘルプを参照できます。

こいつを launchd 使って定期実行したらうまくいきました。ちなみに
macOS では cron は非奨励で、代わりに launchd が奨励されています。

作成した scheduled-timemachine.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>net.masutaka.scheduled-timemachine</string>
    <key>ProgramArguments</key>
    <array>
      <string>sh</string>
      <string>-c</string>
      <string>date; sudo tmutil disable && pmset -g ps | grep -q 'AC Power' && tmutil startbackup -b; echo</string>
    </array>
    <key>StandardOutPath</key>
    <string>/Users/masutaka/.Trash/scheduled-timemachine.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/masutaka/.Trash/scheduled-timemachine-err.log</string>
    <key>StartCalendarInterval</key>
    <dict>
      <key>Hour</key>
      <integer>3</integer>
      <key>Minute</key>
      <integer>00</integer>
    </dict>
  </dict>
</plist>

GitHub に最新のファイルが公開されています。

解説

<sudo tmutil disable>
「バックアップを自動作成」は ON にする必要はないため、このコマンド
で OFF にしています。man にも書かれていますが、root 権限が必要なの
で、sudo で実行しています。

Time Machine

<pmset -g ps | grep -q ‘AC Power’>
このコマンドでバッテリー利用時の Time Machine バックアップを避けて
います。他に良いやり方があるか?や、そもそも Time Machine が良い感
じに判断してくれる?などは未検証です。

# AC アダプター(給電)利用中
$ pmset -g ps
Now drawing from 'AC Power'
 -InternalBattery-0 (id=4980835)        100%; charged; 0:00 remaining present: true

# バッテリー利用中
$ pmset -g ps
Now drawing from 'Battery Power'
 -InternalBattery-0 (id=4980835)        100%; discharging; (no estimate) present: true

<tmutil startbackup -b>
-b は前回のバックアップが終わっていなかったら、待つオプションです。
tmutil startbackup は root 権限不要です。

使い方

このディレクトリにコピーします。シンボリックリンクでも良いです。

$ cd ~/Library/LaunchAgents
$ cp /path/to/scheduled-timemachine.plist .

サービスを登録します。

$ launchctl load scheduled-timemachine.plist

サービスを削除します。

$ launchctl unload scheduled-timemachine.plist

scheduled-timemachine.plist を変更した場合は一旦削除してから登録す
る必要があります。

まとめ

launchd を使って Time Machine を実行することで、作業中のストレスを
減らせました。

macOS デフォルトの機能を使ったので、TimeMachineScheduler も不要に
なりました。