macOSでバックグラウンド処理を自動化!launchdとlaunchctlの使い方完全ガイド

Mac

「毎日決まった時間にバックアップを取りたい」
「パソコンを起動したら自動的にあのアプリが立ち上がってほしい」

そんな「自動化」の願いを叶えてくれるのが、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コマンドで実際に動かしてみましょう。

操作の基本的な流れ

  1. 作成:plistファイルを作る
  2. ロード:launchdに設定を読み込ませる
  3. 確認:正しく動いているかチェック
  4. 修正:必要に応じて設定を変更

ファイルのロードとアンロード

ロード(設定を有効にする)

# ユーザーエージェントの場合
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コマンドでジョブを管理
  • デーモンとエージェントの使い分けが重要
  • 適切な権限設定でセキュリティを確保

自動化できること

  • 定期的なバックアップ:大切なデータを守る
  • システムメンテナンス:掃除やアップデートの自動化
  • 開発環境の準備:必要なサービスの自動起動
  • ログの整理:古いファイルの自動削除
  • レポートの生成:定期的なデータ収集と分析

コメント

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