macOSのlaunchdで毎日決まった時間に処理を実行する設定手順

macOSのlaunchdで毎日決まった時間に処理を実行する設定手順 定期実行と通知

集計するプログラムを作ったら、次は「自分で実行しなくても動く」状態にします。ここまで来て、はじめて自動化です。

Macでこれをやる標準の仕組みが launchd(ローンチディー) です。私は経理の集計を毎月1回、チームの進捗チェックを毎週1回、これで動かしています。

ネット上には cron を使う情報が多いのですが、macOSで安定して動かすならlaunchdを使ってください。


設定は1ファイル作るだけ

launchdは、「いつ」「何を」動かすかを書いた1枚のファイルを置くだけで動きます。

置き場所はここです。

~/Library/LaunchAgents/

ファイル名は 好きな名前.plist にします。他と混ざらないよう、会社名や用途を入れた名前にしておくと後で分かりやすくなります。

com.jibunnokaisha.keiri.plist

実際に使っている設定ファイル

毎月15日の朝8時に、集計スクリプトを動かす設定です。

<?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>com.jibunnokaisha.keiri</string>

  <key>ProgramArguments</key>
  <array>
    <string>/Users/ユーザー名/scripts/keiri/run.sh</string>
  </array>

  <key>StartCalendarInterval</key>
  <dict>
    <key>Day</key><integer>15</integer>
    <key>Hour</key><integer>8</integer>
    <key>Minute</key><integer>0</integer>
  </dict>

  <key>StandardOutPath</key>
  <string>/Users/ユーザー名/scripts/keiri/logs/out.log</string>
  <key>StandardErrorPath</key>
  <string>/Users/ユーザー名/scripts/keiri/logs/err.log</string>

</dict></plist>

書いているのは4つだけです。

項目 意味
Label この設定の名前。ファイル名と揃える
ProgramArguments 動かすもの。必ずフルパスで書く
StartCalendarInterval いつ動かすか
StandardOutPath / StandardErrorPath 結果とエラーの記録先

⚠️ ログの2行は必ず書いてください。
これを省くと、動かなかったときに理由がどこにも残りません。私はこれで数ヶ月を無駄にしました。


時間の指定のしかた

書いた項目だけが条件になります。書かなかった項目は「毎回」の意味になります。

やりたいこと 書き方
毎日 朝8時 Hour 8 / Minute 0
毎週月曜 朝8時 Weekday 1 / Hour 8 / Minute 0
毎月15日 朝8時 Day 15 / Hour 8 / Minute 0
1時間ごと Minute 0 だけ書く

Weekday は日曜が0、月曜が1です。

Minute を書き忘れると、その時間帯に毎分動きます。 これは事故になるので必ず書いてください。


登録して動かす

ファイルを置いたら、Macに登録します。

launchctl load ~/Library/LaunchAgents/com.jibunnokaisha.keiri.plist

止めたいときは unload です。

launchctl unload ~/Library/LaunchAgents/com.jibunnokaisha.keiri.plist

登録されているか確認します。

launchctl list | grep jibunnokaisha

設定ファイルを書き換えたら、必ず unload → load をやり直してください。 保存しただけでは反映されません。


⚠️ 時間を待たずにテストする

ここを飛ばす人が多いのですが、いちばん重要な手順です。

「毎月15日」で設定して、15日まで待って確認する——これはやめてください。動いていなかった場合、気づくのが1ヶ月後になります。

登録した設定を、その場で強制的に1回動かせます。

launchctl start com.jibunnokaisha.keiri

そのあと、ログを確認します。

cat ~/scripts/keiri/logs/out.log
cat ~/scripts/keiri/logs/err.log

ここで動くことを確認するまでは、設定は完了していません。
「ターミナルで手動実行したら動いた」は確認になりません。launchd経由で動くかどうかは別の話です。

手動では動くのにlaunchdからだと失敗する、という症状はよく起きます。原因と直し方は launchdが動かない・終了コード127の原因と対処 にまとめました。


知っておくべき挙動

Macが閉じていた時間の処理はどうなるか

指定時刻にMacがスリープや電源オフだった場合、その回は飛ばされますが、次に起動したときにまとめて実行されます。

これは便利な反面、注意も要ります。朝一番にMacを開いた瞬間、前日ぶんが動き出すことがあります。通知が突然来て驚くかもしれませんが、正常な動作です。

毎日動かすなら、時刻はいつがよいか

深夜を指定すると、Macが閉じていて動かないことが増えます。始業前後の、パソコンが起きている時間帯を選ぶのが確実です。

どうしても深夜に動かす必要があるなら、そのときが常時稼働のサーバーを検討するタイミングです。

広告:さくらのVPS。常時稼働の環境が必要になったときの検討候補です。契約前に料金・必要な容量・運用方法を公式サイトで確認してください。

さくらのVPS 仮想専用サーバー



設定ファイルを直接書かなくてよい

ここまで読んで「XMLは書きたくない」と思われたかもしれません。書かなくて大丈夫です。

AIにこう頼めば作ってくれます。

「Macのlaunchdで、毎週月曜の朝8時に /Users/○○/scripts/run.sh を実行したいです。ログも残したい。plistファイルの中身と、登録するコマンドを教えてください」

私も自分で書いてはいません。ただし、どの項目が何を意味するかは知っておいてください。 動かなかったときに、どこを疑えばよいか分からなくなります。


まとめ

  • Macの定期実行は cronではなくlaunchd
  • 設定は ~/Library/LaunchAgents/ に plistを1枚置くだけ
  • ログの出力先は必ず指定する。書かないと失敗の理由が残らない
  • Minute の書き忘れは毎分実行の事故になる
  • 設定を変えたら unload → load
  • launchctl start で時間を待たずにテストする。ここまでやって完了

自動化は、書いたときではなく「自分が何もしていないのに動いたのを見たとき」に完成します。

コメント

タイトルとURLをコピーしました