「毎日決まった時間にバックアップを取りたい」
「パソコンを起動したら自動的にあのアプリが立ち上がってほしい」
そんな「自動化」の願いを叶えてくれるのが、macOSに標準で搭載されているlaunchd(ローンチディー)という仕組みです。
launchdを使えば、スクリプトやアプリケーションを決まった時間に実行したり、システム起動時に自動で動かしたりすることができます。
この記事では、launchdの基本的な使い方から実際の設定方法まで、プログラミング初心者の方にもわかりやすく解説します。
launchdって何?まずは基本を理解しよう

launchdとlaunchctlの役割分担
macOSの自動化には、2つの重要な仕組みがあります。
launchd(ローンチディー)
- Macが起動したときに一番最初に動き出すプログラム
- 「総監督」のような存在
- システム全体のバックグラウンド処理を管理
- 私たちが直接操作することはほとんどない
launchctl(ローンチコントロール)
- launchdに指示を出すためのコマンド
- 「リモコン」のような存在
- ターミナルから操作する
- 私たちが実際に使うのはこちら
どんなことができるの?
launchdを使うと、こんな便利なことができます。
時間指定の自動実行
- 毎日午前10時にバックアップを実行
- 毎週月曜日にシステム掃除を実行
- 30分ごとに特定の処理を実行
システム起動時の自動実行
- Macを起動したら自動的にサーバーソフトを立ち上げ
- ログイン時に必要なアプリを自動起動
- 特定の条件が揃ったときに処理を実行
バックグラウンドでの常駐
- 重要なサービスを常に動かし続ける
- 異常が発生したときに自動的に再起動
- ファイルの変更を監視して自動処理
デーモンとエージェント:2つの働き方

launchdで動かすプログラムには、デーモンとエージェントという2つのタイプがあります。
デーモン:システム全体のお手伝いさん
デーモンの特徴
- 誰がログインしていても動き続ける
- システム全体に関わる重要な処理を担当
- Macが起動している間は常に稼働
- 管理者権限が必要な処理に適している
具体例
- Webサーバーの運用
- データベースの管理
- システム監視
- セキュリティ関連の処理
エージェント:個人専用のアシスタント
エージェントの特徴
- 特定のユーザーがログインしたときだけ動く
- そのユーザーに関連する処理を担当
- ログアウトすると停止する
- 個人の設定やファイルを扱うのに適している
具体例
- 個人フォルダのバックアップ
- メール自動チェック
- 個人用アプリの自動起動
- デスクトップの整理
設定ファイル(plist)を作ってみよう

plistファイルって何?
launchdに「何をいつ実行するか」を教えるために、plist(ピーリスト)ファイルという設定ファイルを作ります。
plistは「Property List(プロパティリスト)」の略で、設定内容をXML形式で書いたファイルです。
plistファイルの役割
- プログラムの場所を指定
- 実行タイミングを設定
- ログの出力先を決める
- エラー時の動作を定義
どこに置くかで動作が変わる
plistファイルを置く場所によって、どのように動くかが決まります。
デーモン用の場所
/Library/LaunchDaemons
:サードパーティ製のシステム全体デーモン/System/Library/LaunchDaemons
:Apple純正のシステムデーモン(触らない)
エージェント用の場所
~/Library/LaunchAgents
:あなた専用のエージェント(おすすめ)/Library/LaunchAgents
:全ユーザー共通のエージェント/System/Library/LaunchAgents
:Apple純正のエージェント(触らない)
初心者におすすめ 最初は ~/Library/LaunchAgents
から始めましょう。
自分だけの設定なので、失敗しても他のユーザーに影響しません。
基本的なplistファイルを作ってみよう
シンプルな例から始めてみましょう。毎日決まった時間にスクリプトを実行するplistファイルです。
<?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.myname.daily-backup</string>
<key>ProgramArguments</key>
<array>
<string>/Users/username/Scripts/backup.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>10</integer>
<key>Minute</key>
<integer>30</integer>
</dict>
<key>StandardOutPath</key>
<string>/Users/username/Logs/backup.log</string>
<key>StandardErrorPath</key>
<string>/Users/username/Logs/backup_error.log</string>
</dict>
</plist>
各項目の説明
- Label:この設定に付ける名前(重複しないようにユニークに)
- ProgramArguments:実行するプログラムやスクリプトのパス
- StartCalendarInterval:実行する時刻(この例では毎日10:30)
- StandardOutPath:正常な出力を記録するファイル
- StandardErrorPath:エラーを記録するファイル
よく使う設定項目
実行タイミングの設定
<!-- システム起動時に1回だけ実行 -->
<key>RunAtLoad</key>
<true/>
<!-- 30分ごとに実行 -->
<key>StartInterval</key>
<integer>1800</integer>
<!-- 毎週月曜日の9時に実行 -->
<key>StartCalendarInterval</key>
<dict>
<key>Weekday</key>
<integer>1</integer>
<key>Hour</key>
<integer>9</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
プロセス管理の設定
<!-- プロセスが終了したら自動的に再起動 -->
<key>KeepAlive</key>
<true/>
<!-- 作業ディレクトリを指定 -->
<key>WorkingDirectory</key>
<string>/Users/username/Projects</string>
<!-- 環境変数を設定 -->
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin</string>
</dict>
launchctlコマンドで操作してみよう

基本的な操作の流れ
plistファイルを作ったら、launchctlコマンドで実際に動かしてみましょう。
操作の基本的な流れ
- 作成:plistファイルを作る
- ロード:launchdに設定を読み込ませる
- 確認:正しく動いているかチェック
- 修正:必要に応じて設定を変更
ファイルのロードとアンロード
ロード(設定を有効にする)
# ユーザーエージェントの場合
launchctl load ~/Library/LaunchAgents/com.myname.daily-backup.plist
# システムデーモンの場合(管理者権限が必要)
sudo launchctl load /Library/LaunchDaemons/com.myname.system-task.plist
アンロード(設定を無効にする)
# ユーザーエージェントの場合
launchctl unload ~/Library/LaunchAgents/com.myname.daily-backup.plist
# システムデーモンの場合
sudo launchctl unload /Library/LaunchDaemons/com.myname.system-task.plist
永続的な有効化・無効化
# -w オプションを付けると、次回起動時も有効/無効が維持される
launchctl load -w ~/Library/LaunchAgents/com.myname.daily-backup.plist
launchctl unload -w ~/Library/LaunchAgents/com.myname.daily-backup.plist
ジョブの開始と停止
ロードした後、手動でジョブを開始・停止することもできます。
# ジョブを今すぐ開始
launchctl start com.myname.daily-backup
# ジョブを停止
launchctl stop com.myname.daily-backup
# ジョブを再起動
launchctl stop com.myname.daily-backup
launchctl start com.myname.daily-backup
動作状況の確認
# 登録されているすべてのジョブを表示
launchctl list
# 特定のジョブだけを検索
launchctl list | grep myname
# 詳細情報を表示
launchctl list com.myname.daily-backup
出力の見方
PID Status Label
1234 0 com.myname.daily-backup
- PID:プロセスID(実行中の場合)
- Status:終了コード(0は正常終了)
- Label:ジョブの名前
実践的な使用例

例1:毎日のバックアップを自動化
やりたいこと 毎日夜10時に、重要なフォルダをバックアップしたい
1. バックアップスクリプトを作成
# ~/Scripts/daily_backup.sh
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/Users/username/Backups"
SOURCE_DIR="/Users/username/Documents/Important"
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/backup_$DATE.tar.gz" "$SOURCE_DIR"
echo "$(date): Backup completed" >> "$BACKUP_DIR/backup.log"
2. 実行権限を付与
chmod +x ~/Scripts/daily_backup.sh
3. plistファイルを作成
<!-- ~/Library/LaunchAgents/com.username.daily-backup.plist -->
<?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.username.daily-backup</string>
<key>ProgramArguments</key>
<array>
<string>/Users/username/Scripts/daily_backup.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>22</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>StandardOutPath</key>
<string>/Users/username/Logs/backup.log</string>
<key>StandardErrorPath</key>
<string>/Users/username/Logs/backup_error.log</string>
</dict>
</plist>
4. ロードして有効化
launchctl load -w ~/Library/LaunchAgents/com.username.daily-backup.plist
例2:システム起動時にWebサーバーを自動起動
やりたいこと Macが起動したら自動的にローカルWebサーバーを立ち上げたい
plistファイルの例
<?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.username.local-webserver</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/python3</string>
<string>-m</string>
<string>http.server</string>
<string>8080</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/username/WebSite</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/Users/username/Logs/webserver.log</string>
<key>StandardErrorPath</key>
<string>/Users/username/Logs/webserver_error.log</string>
</dict>
</plist>
トラブルシューティング:よくある問題と解決法

「ジョブがロードできない」
症状
launchctl load ~/Library/LaunchAgents/com.myname.test.plist
# エラーが表示される
原因と対策
1. ファイルのパーミッション(権限)が間違っている
# 正しい権限を設定
chmod 644 ~/Library/LaunchAgents/com.myname.test.plist
2. XML形式が間違っている
- plistファイルの書式をチェック
- XMLのタグが正しく閉じられているか確認
- 文字エンコーディングがUTF-8になっているか確認
3. プログラムのパスが間違っている
# パスが正しいか確認
ls -la /Users/username/Scripts/myscript.sh
「ジョブが実行されない」
確認手順
1. ジョブがロードされているか確認
launchctl list | grep myname
2. 実行されるファイルに実行権限があるか確認
chmod +x /Users/username/Scripts/myscript.sh
3. ログファイルを確認
# 標準出力ログ
cat /Users/username/Logs/output.log
# エラーログ
cat /Users/username/Logs/error.log
# システムログ
log show --predicate 'process == "launchd"' --last 1h
4. 手動実行でテスト
# 設定したスクリプトを手動で実行してみる
/Users/username/Scripts/myscript.sh
「ジョブが予期せず停止する」
原因と対策
1. スクリプト内でエラーが発生している
- エラーログを確認
- スクリプトにエラーハンドリングを追加
2. 必要なファイルやディレクトリが存在しない
# スクリプト内でディレクトリを作成
mkdir -p /Users/username/Logs
mkdir -p /Users/username/Scripts
3. 環境変数が設定されていない
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin</string>
<key>HOME</key>
<string>/Users/username</string>
</dict>
セキュリティと権限について

ファイルの権限設定
launchdは非常に重要なシステムなので、セキュリティに注意が必要です。
推奨される権限設定
# ユーザーエージェントの場合
chmod 644 ~/Library/LaunchAgents/com.myname.test.plist
chown username:staff ~/Library/LaunchAgents/com.myname.test.plist
# システムデーモンの場合
sudo chmod 644 /Library/LaunchDaemons/com.myname.test.plist
sudo chown root:wheel /Library/LaunchDaemons/com.myname.test.plist
セキュリティのベストプラクティス
1. 最小権限の原則
- システム全体に影響するデーモンは避ける
- 可能な限りユーザーエージェントを使用
- 必要以上の権限を与えない
2. スクリプトのセキュリティ
- 実行するスクリプトの権限を適切に設定
- 外部からの入力を受け取る場合は入力検証を行う
- 機密情報を平文で保存しない
3. ログの管理
- ログファイルの権限を適切に設定
- 機密情報がログに出力されないよう注意
- 定期的にログファイルをローテーション
まとめ:launchdで始める自動化ライフ
launchdとlaunchctlを使った自動化、いかがでしたか?
今日学んだポイント
- launchdはmacOSの自動化を担う重要なシステム
- plistファイルで実行内容とタイミングを設定
- launchctlコマンドでジョブを管理
- デーモンとエージェントの使い分けが重要
- 適切な権限設定でセキュリティを確保
自動化できること
- 定期的なバックアップ:大切なデータを守る
- システムメンテナンス:掃除やアップデートの自動化
- 開発環境の準備:必要なサービスの自動起動
- ログの整理:古いファイルの自動削除
- レポートの生成:定期的なデータ収集と分析
コメント