launchdの設定ファイル(plist)を開いて時刻を書き換え、保存した。それなのに、翌日も前の時刻のまま動く。あるいは、何時に動く設定になっているのか自分でも分からなくなる。原因は、あなたが書き換えたファイルと、Macが覚えている設定が、別物だからです。
結論を先に書きます。plistは保存しただけでは反映されません。launchctl bootout でいったん登録を外し、launchctl bootstrap で入れ直して、初めてMacが新しい時刻を覚えます。そして「いま本当は何時に動いているか」を確かめる一番確実な方法は、launchctlのコマンドではなく、自動化が書いているログの時刻を見ることです。
私は清掃業を経営していて、プログラマーではありません。うちのMacでは6件の自動化がlaunchdで毎日動いています。この記事は、その6件の設定ファイルと動作記録を実際に見比べて書いています。
plistは「ファイル」と「登録済みの設定」の2つある
ここが分かれば残りは簡単です。launchdの設定には、常に2つの状態があります。
| 実体 | 書き換えると | |
|---|---|---|
| ファイル | ~/Library/LaunchAgents/ に置いてあるplist |
すぐ変わる。保存した瞬間に新しい内容になる |
| 登録済みの設定 | Macが起動時に読み込んで、メモリの中に覚えているもの | 変わらない。読み込んだ時点の古い内容のまま |
実際に時刻どおりに動いているのは下の「登録済みの設定」のほうです。上のファイルは、次に読み込まれるまで待っている下書きにすぎません。
だから「ファイルは直したのに反映されない」は、不具合ではなく仕様です。Macに「読み直して」と言っていないだけです。
直したら、この2行を実行する
ラベル(plistの Label に書いてある名前)を書き換えて、そのまま貼ってください。
launchctl bootout gui/$(id -u)/com.media.autopost
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.media.autopost.plist
1行目が「いま覚えている設定を捨てる」、2行目が「ファイルを読み直して覚え直す」です。2行で1セットだと思ってください。1行目だけ実行して満足すると、その自動化は止まったままになります。
$(id -u) はそのまま貼って構いません。自分の利用者番号に自動で置き換わります。
古い load / unload との違い
ネットで調べると launchctl unload と launchctl load という書き方も出てきます。うちでも以前はこちらを使っていました。動きますが、失敗したときに何も言わずに終わることがあります。「実行したのに反映されない」の原因の一つがこれです。
bootout / bootstrap のほうは、失敗すると理由を出して止まります。黙って失敗しないぶん、こちらが安全です。これから覚えるなら bootout / bootstrap の2つだけで足ります。
1行目でエラーが出たとき
bootout で「そんなものは無い」という趣旨のエラーが出たら、その自動化はそもそも登録されていません。止まっていたということです。無視して2行目だけ実行すれば登録されます。
いま実際に何時に動く設定になっているか、確かめる
順番が大事です。上から順にやると、非エンジニアでも確実です。
① ログの時刻を見る(いちばん確実)
コマンドの読み方を覚える必要がありません。自動化が実際に走った時刻が、そのまま記録に残っているからです。うちの記録はこうなっています。
tail -5 ~/scripts/media/logs/自動公開ログ.txt
| 日付 | 記録された時刻 |
|---|---|
| 2026-08-24 | 23:00 |
| 2026-08-25 | 23:00 |
| 2026-08-26 | 記録なし |
| 2026-08-27 | 07:00 |
| 2026-08-28 | 07:00 |
| 2026-08-29 | 07:00 |
| 2026-08-30 | 07:00 |
この表を見れば、設定が23時から7時に切り替わったのは8月27日だと一目で分かります。plistを開く必要も、コマンドを覚える必要もありません。ログの時刻は嘘をつきません。
ついでに大事なことが1つ見えています。切り替えた8月26日は、1回も動いていません。23時を7時に前倒しすると、その日の7時はもう過ぎているので次の出番は翌朝になります。時刻を前に動かした日は1回飛ぶと思っておいてください。慌てて「壊れた」と判断すると、直っているものを触ってまた壊します。
② ファイルの中身を読む
plistはXMLという読みにくい形式ですが、次のコマンドで人間向けに整形して表示できます。
plutil -p ~/Library/LaunchAgents/com.media.autopost.plist
StartCalendarInterval のところに書いてある Hour と Minute が、そのファイルが主張している時刻です。あくまで「ファイルが主張している」だけで、Macがそれを覚えているとは限らない、というのがこの記事の話です。
ついでに、書式が壊れていないかも確かめられます。
plutil -lint ~/Library/LaunchAgents/com.media.autopost.plist
OK と出れば形式は正しいです。ここでエラーが出るplistは、bootstrapしても絶対に登録されません。タグの閉じ忘れが典型です。書き換えたら毎回これを通す癖をつけると、無駄に悩む時間が消えます。
③ 登録済みの設定を直接のぞく
Macが今まさに覚えている内容を出します。
launchctl print gui/$(id -u)/com.media.autopost
登録されている内容がそのまま出てくるので、②で読んだファイルと見比べます。ここが食い違っていたら、それが「反映されていない」の正体です。出力は長くて専門的なので、①と②で解決するなら無理に読まなくて構いません。
④ 時刻を待たずに、その場で1回動かす
入れ直したあと、翌朝まで待って確認するのはやめてください。動いていなかった場合、気づくのが翌日になります。
launchctl kickstart -k gui/$(id -u)/com.media.autopost
これで即座に1回動きます。そのあと①のログを見て、いまの時刻の記録が増えていれば成功です。
ただし
kickstartは「手で動かす」に近い動作です。これが成功しても「指定時刻に自動で動く」ことの証明にはなりません。時刻そのものを試したいなら、plistを数分後の時刻にして本当に動くか見るのが確実です。
うちが実際に踏んだ、時刻の二重管理
plistを入れ直す手順より、こちらのほうが後で効いてきます。時刻の情報が、plist以外の場所にも書かれていることがあるという話です。
見張りスクリプトが、時刻を文字で持っていた
うちには「今日の自動化が全部動いたか」を毎日13時にまとめて点検して通知する仕組みがあります。その中身は、こういう行が並んでいるだけです。
shiraberu "事務自動化ラボ 自動公開" "07:00" "com.media.autopost" \
"(今日動いた証拠を探すコマンド)"
この "07:00" は、通知に表示するためだけのただの文字です。plistとは何もつながっていません。plistの時刻を変えても、この文字は変わりません。放っておくと、通知には古い時刻が出続けます。
実害はすぐには出ません。だからこそ、半年後に「何時に動いてるんだっけ」と思って通知を見た自分が、堂々と間違えます。時刻を変えたら、plistと点検側の両方を直す。これを手順として決めておかないと必ずずれます。
ファイル名も古くなる
もう1つ運営している旅行系サイトには 週2回公開.sh という名前のスクリプトがあります。名前のとおり、以前は週2回だけ動かす設定でした。修理前のバックアップに残っている当時のplistは、水曜と土曜の12時を指定しています。
いまのplistは、毎日12時です。設定だけ変えて、ファイル名はそのままにしたからです。
名前もコメントも、書いた瞬間から古くなります。いつ動くかを知りたいときに信じてよいのは、plistとログだけです。ファイル名で判断すると間違えます。
触る前にバックアップを取る
plistは短いファイルなので、つい直接書き換えたくなります。それでも1行だけ先に打ってください。
cp ~/Library/LaunchAgents/com.media.autopost.plist \
~/Library/LaunchAgents/com.media.autopost.plist.bak-$(date +%Y%m%d-%H%M%S)
うちでは2026年8月27日に自動化の作り直しをしたとき、触る前にplistとスクリプトを丸ごと ~/scripts/media/backup/ の日付入りフォルダへコピーしてから作業しました。この記事で「以前は週2回だった」と断言できるのは、そのコピーが残っているからです。バックアップは、戻すためだけでなく「前はどうだったか」を後から証明するためにも効きます。
バックアップファイルは
~/Library/LaunchAgents/の中に置いても拡張子が.plistで終わらなければ読み込まれません。上の.bak-日付の形なら安全です。コピー.plistのような名前で残すと、同じ処理が二重に動きます。
明日やるなら、この順番で
- 変える前に
cpでバックアップを取る - plistの
HourとMinuteを書き換えて保存する plutil -lintでOKが出ることを確かめるbootout→bootstrapの2行を実行する(1行目だけで終わらない)kickstartでその場で1回動かし、ログに今の時刻が増えるか見る- 点検の仕組みや手順書に時刻を書いているなら、そこも直す
- 翌日、ログの時刻が新しい時刻になっているかもう一度だけ見る
7番まで済ませて完了です。時刻を前倒しした場合、当日は飛びます。その日のログが空でも、翌日に新しい時刻で記録が付いていれば正常です。
まとめ
- plistには「ファイル」と「Macが覚えている設定」の2つがある。時刻どおりに動くのは後者
- 保存しただけでは反映されない。
bootout→bootstrapの2行で1セット - 古い
unload/loadは黙って失敗することがある。これから覚えるならbootout/bootstrapだけでよい - いま何時に動いているかは、ログの時刻を見るのがいちばん確実。コマンドを覚える必要がない
- 時刻を前倒しした日は1回飛ぶ。うちでは23時から7時に変えた8月26日が丸1日空いている
- 時刻はplist以外にも書かれている。点検スクリプトの表示やファイル名は古くなる。信じてよいのはplistとログだけ
- 触る前に
cpでバックアップ。ただし.plistで終わる名前で残さない
そもそもplistをどう書くか、時刻の指定でどこを間違えやすいかは macOSのlaunchdで毎日決まった時間に処理を実行する設定手順 にまとめてあります。これから1つめの自動化を作るなら、先にそちらを読んでください。


コメント