launchdのplistを直したのに反映されない理由|bootoutとbootstrapの使い方

launchdのplistを直したのに反映されない理由|bootoutとbootstrapの使い方 定期実行と通知

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 のような名前で残すと、同じ処理が二重に動きます。


明日やるなら、この順番で

  1. 変える前に cp でバックアップを取る
  2. plistの Hour と Minute を書き換えて保存する
  3. plutil -lint で OK が出ることを確かめる
  4. bootout → bootstrap の2行を実行する(1行目だけで終わらない)
  5. kickstart でその場で1回動かし、ログに今の時刻が増えるか見る
  6. 点検の仕組みや手順書に時刻を書いているなら、そこも直す
  7. 翌日、ログの時刻が新しい時刻になっているかもう一度だけ見る

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つめの自動化を作るなら、先にそちらを読んでください。

コメント

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