手動で動くスクリプトができても、自動化はまだ半分です。次に必要なのは、決まった間隔で起動し、失敗した時に原因を追える仕組みです。メール通知の試作では、macOS標準のlaunchdを使う例を用意しました。
定期実行ファイルに書くもの
LaunchAgentの設定には、実行するPython、スクリプトの絶対パス、作業フォルダ、実行間隔、標準出力と標準エラーの保存先を記載します。
重要なのは、対話シェルと自動実行の環境が違うことです。ターミナルでは動くのにlaunchdでは動かない場合、PATH、Python環境、作業フォルダ、外付けディスクのマウント状態を疑います。
30分ごとの実行から始める
最初は「30分ごと」のような分かりやすい間隔にし、同じメールを二重通知しないことを確認します。ジョブを登録した直後に一度手動実行し、ログとDiscordの両方を見ます。
本番化の前に、次の失敗も意図的に試します。
- ネットワークを切る
- 認証情報を一時的に無効なダミーへ変える
- Discord投稿先を無効にする
- 外付けディスクを外す
失敗時に再試行し続けて通知を連打する設計は避けます。指数バックオフや次回実行への持ち越しを検討します。
Macのスリープは重要な前提
ユーザー用LaunchAgentは、Macがスリープ中なら期待した時刻に処理されないことがあります。スリープ解除後の次回タイミングから再開する設計なら、その前提を明記します。厳密な時刻保証が必要なら、常時稼働機やサーバー、クラウド実行へ移す方が適切です。
私はここで「自動化の成功条件」を、予定時刻に起動することだけではなく、次の三点に広げました。
- 処理の最終成功時刻が分かる
- 失敗理由がログに残る
- 一定時間成功していなければ別経路で気づける
再現チェック
- [ ] 実行ファイルと作業フォルダを明示した
- [ ] 標準出力と標準エラーの保存先がある
- [ ] 手動実行と自動実行の両方を試した
- [ ] スリープ中の挙動を確認した
- [ ] 二重通知を防いだ
- [ ] 最終成功時刻を確認できる
次回からは外部サービス連携を一段深め、freee会計APIを読み取り専用からつなぎます。
