個人開発の学習メモです。今回は日々の開発記録ではなく、最近の開発で何度も助けられた「Macでプログラムを24時間、勝手に動かし続ける仕組み」=launchd(ローンチディー)を、初学者向けに腰を据えて整理します。電車アプリのデータ収集も、家計アプリのメール監視も、これで”手離れ”しました。

Contents

まず結論

「ターミナルを開けっ放しにして動かす」のは、卒業したほうがいい——これが結論です。手動運用には3つの止まりどころがあり、そのどれかでデータの欠測が始まります。launchdに登録すると、その3つが全部消えて、再起動しても停電から復帰しても、プログラムが勝手に戻ってくるようになります。

なぜ「ターミナル開けっ放し」ではダメなのか

私は最初、収集スクリプトを「ターミナルの窓で実行して、閉じずに置いておく」やり方で動かしていました。これでも一応動きます。でも、次の3つのどれかが起きた瞬間に、静かに止まります。

  • 窓を閉じる:うっかりターミナルのタブを閉じたら終了
  • ログアウト:ログアウトすると、その窓のプログラムも道連れ
  • 再起動・停電:Macが再起動したら、当然何も動いていない

このブログで何度か書いた「欠測」——データが”少なかった”のではなく”そもそも観測していなかった”状態——の多くは、これが原因でした。実際、収集役のMacがスリープして数時間ぶんの記録が丸ごと抜けたこともあります。止まっても誰も気づかないのが、手動運用のいちばん怖いところです。

なぜ cron ではなく launchd なのか

「定期実行」と聞くと、昔からあるcron(クーロン)を思い浮かべる人もいるかもしれません。でも今のMac(macOS)では、標準の常駐管理はlaunchdのほうです。cronも一応残ってはいますが、Apple自身がlaunchdを正式なやり方としています。

launchdを選ぶ実利は、はっきりしています。cronは基本「決まった時刻に起動する」だけですが、launchdは「Mac起動と同時に動かす」「落ちたら自動で立て直す」まで面倒を見てくれます。24時間止めたくない用途では、この差が効いてきます。

仕組みの心臓:2つのスイッチ

launchdは、設定ファイル(plistという小さな決まり書き)を1枚置くだけで動きます。中身の大半は「どのプログラムを、どこで動かすか」の住所書きですが、初学者が押さえるべきはたった2つのスイッチです。

<key>RunAtLoad</key>   <true/>   ← Mac起動時に自動で動き出す
<key>KeepAlive</key>   <true/>   ← 落ちても自動で立て直す

この2つが、それぞれ先ほどの弱点をつぶします。

  • RunAtLoad=停電・再起動対策。Macが立ち上がれば、何もしなくてもプログラムが動き出す。停電から復帰しても、勝手に収集が戻ってきます
  • KeepAlive=突然死対策。プログラムが何かの拍子に落ちても、launchdが自動で起動し直してくれる。いわば”保険”です

特にKeepAliveは、このブログの「ソフトは正直に、そして安全に壊れるべき」という話とつながります。落ちること自体は避けられない。だから落ちても自動で立ち直る作りにしておく。人間が気づく前に、仕組みが復旧している——これが常駐化のいちばんの価値です。

登録と、動いているかの確認

設定ファイルを置いたら、launchdに読み込ませます。そして必ず「本当に動いているか」を自分の目で確かめます。「登録したつもり」がいちばん危ないからです。

# 登録(読み込ませる)
launchctl load ~/Library/LaunchAgents/自分の設定ファイル.plist

# 登録されているか一覧で確認
launchctl list | grep 自分の名前

# ログが流れているかを、リアルタイムで覗く
tail -f ~/.../logs/collect.log

ログに収集の行が流れ始めれば成功です。ここでログをファイルに残す設定にしておくのも大事なポイントでした。あとで異常な値が出たとき、「その瞬間、何が起きていたか」を後から追える証拠になります。前に書いた「わざと壊して、正しく動くか確かめる」——再起動してみて本当に自動復帰するかを一度試す、というテストも、ここでやっておくと安心です。

初学者がハマる、たった1つの落とし穴

正直に書くと、私も一度ハマりました。設定ファイルの中に書いたパス(プログラムの置き場所)が、実際のユーザー名と食い違っているだけで、静かに動きません。しかもエラーが画面に出ないので、原因に気づきにくい。

対策はシンプルで、動かないときは、まずエラーログ(.errファイル)を見ること。launchdは失敗の理由をそこに書き残してくれています。「画面が沈黙しているときこそ、ログに真実がある」——これも、この2週間で繰り返し学んだことでした。

おわりに ── 「手離れ」は、相棒への第一歩

launchdでの常駐化は、派手な機能ではありません。でも、これを入れたことで、私の収集は「私が見ていなくても、24時間ひとりで働き続ける」状態になりました。

Mac miniが届いた日に「まず任せるのは、賢い仕事ではなく休まず記録し続けるという愚直な仕事から」と書きました。その”休まず”を実際に支えているのが、この地味な仕組みです。自分が寝ている間も、机の上の小箱が黙々とデータを貯めている——常駐化は、相棒に最初の仕事を任せるための、静かな一歩でした。

「決まった時刻に一度だけ動かしたい」なら、また別のやり方(起動間隔を指定する設定)もあります。そのあたりは、また別の学習メモで。


学習メモ / launchd / macOS / 個人開発

このブログでは、ローカルLLM・Aider・個人開発の試行錯誤をそのまま記録しています。