Skip to main content

macOS プロセス自動化手法の概要

macOSのプロセス自動化手法について解説します。launchd、cron、PM2、supervisord、systemd(Linuxエミュレーション経由)、Dockerを使用した信頼性の高いバックグラウンドサービス管理などが含まれます。

javascript typescript angular python ai

macOS プロセス自動化手法の概要

カバー画像

macOS は、プロセスの自動化とサービス管理のための複数のアプローチを提供しており、それぞれが異なるシナリオに適しています。ネイティブの launchd システムから PM2 のような言語固有のプロセスマネージャーまで、macOS でバックグラウンドサービス、スケジュールタスク、本番アプリケーションを実行するには、これらのツールを理解することが不可欠です。

はじめに

macOS でのプロセス自動化は、単なるスクリプト以上のものです。サービスの存続、タスクのスケジューリング、ユーザーセッションに依存しないアプリケーションの管理が含まれます。Node.js API を実行する開発者、システムサービスを管理するシステム管理者、Python スクリプトをスケジュールするデータサイエンティストのいずれであっても、macOS はニーズに合わせたツールを提供しています。

このガイドでは、macOS の主要なプロセス自動化手法について解説します:

  • launchd - macOS のネイティブ init システム
  • brew services - シンプルな Homebrew サービス管理
  • PM2 - Node.js 本番用プロセスマネージャー
  • Supervisord/Circus - Python プロセス制御
  • Overmind - Procfile を使用した開発環境
  • cron - レガシー Unix スケジューリング

クイック比較表

ツールタイプユースケース複雑さ
launchdネイティブシステム本番サービス、スケジュールタスク
brew servicesラッパーHomebrew サービス
PM2Node.jsNode.js 本番環境
ForeverNode.jsシンプルな Node.js
SupervisordPythonPython/任意の言語
CircusPythonモダンな Python
OvermindProcfile開発
cronUnix スケジューラーレガシータスク

ネイティブ macOS: launchd

launchd とは何か

launchd は macOS の init システムおよびサービスマネージャーであり、Linux の systemd に相当します。Mac OS X 10.4 (Tiger) で導入され、デーモン、エージェント、スケジュールタスクを管理します。macOS 上のすべてのプロセス(カーネルを除く)は、最終的には launchd の子プロセスです。

主要コンポーネント:

  • launchd - システムサービスマネージャー
  • launchctl - サービス管理用のコマンドラインインターフェース
  • LaunchAgents - ユーザーレベルサービス(ユーザーログイン時に実行)
  • LaunchDaemons - システムレベルサービス(ブート時に root として実行)

launchctl コマンドリファレンス

Terminal window
# 読み込み済みのすべてのサービスを一覧表示
launchctl list
# サービスをロード
launchctl load ~/Library/LaunchAgents/com.example.service.plist
# サービスをアンロード
launchctl unload ~/Library/LaunchAgents/com.example.service.plist
# サービスを開始
launchctl start com.example.service
# サービスを停止
launchctl stop com.example.service
# サービスログを表示
log stream --predicate 'process == "your-process-name"' --level debug

LaunchAgents と LaunchDaemons の違い

LaunchAgents と LaunchDaemons の区別は基本的です:

側面LaunchAgentsLaunchDaemons
実行タイミングユーザーログイン時システムブート時
実行ユーザーログインユーザーroot/システム
権限ユーザーレベルシステムレベル
GUI アクセス可能不可
場所~/Library/LaunchAgents/ または /Library/LaunchAgents//Library/LaunchDaemons/

LaunchAgents は GUI アクセスが必要なユーザー固有のタスク用です:

  • メニューバーアプリ
  • ユーザー自動化スクリプト
  • ユーザー単位のバックグラウンドサービス

LaunchDaemons は、ユーザーに関係なく実行するシステムサービス用です:

  • データベースサーバー
  • Web サーバー
  • システム監視ツール

plist ファイルの作成

サービスは XML プロパティリスト (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.example.myapp</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/node</string>
<string>/Users/user/myapp/app.js</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>WorkingDirectory</key>
<string>/Users/user/myapp</string>
<key>StandardOutPath</key>
<string>/Users/user/myapp/logs/stdout.log</string>
<key>StandardErrorPath</key>
<string>/Users/user/myapp/logs/stderr.log</string>
<key>EnvironmentVariables</key>
<dict>
<key>NODE_ENV</key>
<string>production</string>
</dict>
</dict>
</plist>

主要な plist キー:

  • Label - 一意のサービス識別子(必須)
  • ProgramArguments - 実行するコマンドと引数
  • RunAtLoad - ロード時に直ちに開始
  • KeepAlive - プロセス終了時に再起動
  • WorkingDirectory - 作業ディレクトリを設定
  • StandardOutPath / StandardErrorPath - ログファイルの場所
  • EnvironmentVariables - プロセスの環境変数
  • StartInterval - 指定した間隔で実行(スケジュールタスク用)
  • CalendarInterval - 指定した時刻で実行(cron の代替スケジューリング)

launchd によるスケジュールタスク

launchd は、macOS では cron に代わってスケジュールタスクを管理するようになりました。cron 構文の代わりに、カレンダー間隔を使用します:

<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>0</integer>
</dict>

これは毎日午前 2 時にタスクを実行します。その他の例:

<!-- 毎時 -->
<key>StartInterval</key>
<integer>3600</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>
<!-- 毎月1日の午前 3 時 -->
<key>StartCalendarInterval</key>
<dict>
<key>Day</key>
<integer>1</integer>
<key>Hour</key>
<integer>3</integer>
<key>Minute</key>
<integer>0</integer>
</dict>

launchd サービスのデバッグ

サービスが開始できない場合:

  1. 構文を確認:
Terminal window
plutil -lint ~/Library/LaunchAgents/com.example.service.plist
  1. システムログを表示:
Terminal window
log show --predicate 'process == "launchd"' --last 1h
log stream --predicate 'eventMessage contains "com.example"'
  1. サービスステータスを確認:
Terminal window
launchctl list | grep com.example
  1. テスト用の手動実行:
Terminal window
# エラーを確認するためにコマンドを直接実行
/usr/local/bin/node /Users/user/myapp/app.js

参考資料: Understanding macOS LaunchAgents and Login ItemsWhat are launchd agents and daemons on macOS?

スケジューリング: launchd vs cron

cron の非推奨ステータス

Apple は cron を非推奨とし、代わりに launchd を推奨していますが、下位互換性のために cron はまだサポートされています。macOS Sequoia では、Apple は System Settings にレガシー cron サポートのフラグを追加しました。

launchd スケジューリングを使用すべき場合

launchd は cron に対して有利な点があります:

  • 更好的な統合 - ネイティブ macOS サービス管理
  • 多くのトリガー - ファイル監視、システムイベントなど、時間だけではない
  • スリープ処理 - スリープ/ウェイクサイクルをインテリジェントに処理
  • セキュリティコンテキスト - 適切な macOS 権限で実行
  • ロギング - Unified Logging と統合

crontab から launchd への移行

crontab エントリー:

0 2 * * * /Users/user/scripts/backup.sh

同等の launchd plist:

<key>Label</key>
<string>com.user.backup</string>
<key>ProgramArguments</key>
<array>
<string>/Users/user/scripts/backup.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>0</integer>
</dict>

cron がまだ有効な場合

cron 構文に既に慣れているシンプルな時間ベースのタスクの場合:

Terminal window
# crontab を編集
crontab -e
# crontab を一覧表示
crontab -l
# crontab を削除
crontab -r

参考資料: Scheduled jobs with launchd rather than cronUse launchd instead of crontab on your Mac

Homebrew Services

インストール

まず、Homebrew をインストールしていない場合はインストールします:

Terminal window
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

その後、インストールを確認します:

Terminal window
brew --version

brew services とは何か

brew services は、バックグラウンドサービスの管理を簡素化する Homebrew 拡張機能です。Homebrew 経由でインストールされたサービスに使い慣れたインターフェースを提供するために launchd をラップしています。

Terminal window
# すべてのサービスを一覧表示
brew services list
# サービスを開始
brew services start postgresql
# サービスを停止
brew services stop redis
# サービスを再起動
brew services restart nginx
# フォアグラウンドでサービスを実行(デバッグ用)
brew services run postgresql

brew services が launchd を使用する方法

brew services は自動的に launchd plist ファイルを作成します:

  • ユーザーサービス~/Library/LaunchAgents/
  • システムサービス/Library/LaunchDaemons/

例えば、brew services start postgresql~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist に plist を作成します。

一般的なユースケース

データベース:

Terminal window
brew install postgresql
brew services start postgresql
brew install mysql
brew services start mysql
brew install redis
brew services start redis

Web サーバー:

Terminal window
brew install nginx
brew services start nginx

開発スタック:

Terminal window
# 複数のサービスを開始
brew services start postgresql
brew services start redis
brew services start memcached

GUI ツール

グラフィカルインターフェースを好むユーザー向け:

参考資料: Homebrew Services: How to Use, How It WorksManaging background processes in Ventura

Node.js プロセスマネージャー

PM2

PM2 は、本番環境での Node.js プロセス管理の事実上の標準です。クラスタリング、監視、自動再起動機能を提供します。

インストール:

Terminal window
npm install pm2 -g

基本コマンド:

Terminal window
# アプリケーションを開始
pm2 start app.js
# 名前を指定して開始
pm2 start app.js --name "api"
# 複数のインスタンスを開始(クラスターモード)
pm2 start app.js -i max
# すべてのプロセスを一覧表示
pm2 list
# ログを表示
pm2 logs
# 監視ダッシュボード
pm2 monit
# プロセスを停止
pm2 stop api
# プロセスを再起動
pm2 restart api
# プロセスを削除
pm2 delete api

PM2 の macOS 起動設定(launchd 統合)

ブート時に PM2 が自動的に開始するようにするには:

Terminal window
# 起動スクリプトを生成して保存
pm2 startup darwin
# 現在のプロセスリストを保存
pm2 save
# ここでアプリを開始
pm2 start app.js
pm2 save

pm2 startup darwin コマンドは、システムブート時に PM2 をロードする launchd plist を生成し、pm2 save は現在のプロセスリストを永続化して、PM2 が再起動後にアプリケーションを復元できるようにします。

参考資料: PM2 DocumentationHow to use pm2 startup command on macOS

Forever

よりシンプルなユースケースでは、Forever は基本的な存続機能を提供します:

Terminal window
npm install forever -g
# スクリプトを開始
forever start app.js
# 実行中のスクリプトを一覧表示
forever list
# スクリプトを停止
forever stop app.js

最適用途: 開発環境、シンプルなスクリプト、PM2 の機能が不要な場合。

参考資料: Running Node.js scripts continuously using forever

その他の Node.js オプション

  • nodemon - ファイル変更時に自動再起動(開発専用)
    Terminal window
    npm install -g nodemon
    nodemon app.js
  • concurrently - 複数の npm スクリプトを同時に実行
    Terminal window
    npm install -g concurrently
    concurrently "npm run watch" "npm run serve"
  • nohup - クィックバックグラウンドタスク用の組み込み Unix コマンド

Python プロセスマネージャー

Supervisord

Supervisord は Unix 系システム用の成熟したプロセス制御システムで、Python 環境で広く使用されています。

インストール:

Terminal window
brew install supervisord
# または pip 経由:
pip install supervisor

設定 (/etc/supervisord.conf または ~/.supervisor/supervisord.conf):

[supervisord]
nodaemon=false
logfile=/var/log/supervisor/supervisord.log
[program:myapp]
command=/usr/bin/python3 /path/to/app.py
directory=/path/to/app
user=myuser
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/myapp.err.log
stdout_logfile=/var/log/supervisor/myapp.out.log

コマンド:

Terminal window
# supervisord を開始
supervisord -c /path/to/supervisord.conf
# ステータスを確認
supervisorctl status
# プログラムを開始
supervisorctl start myapp
# プログラムを停止
supervisorctl stop myapp
# プログラムを再起動
supervisorctl restart myapp
# 設定を再読み込み
supervisorctl reread
supervisorctl update

参考資料: Supervisor Official DocumentationInstall supervisor on Mac M1

Circus

Circus は、Supervisord のモダンな Python ベースの代替手段で、より良いパフォーマンスと活発な開発があります:

Terminal window
pip install circus

Circus 設定 (circus.ini):

[watcher:myapp]
cmd = python3 /path/to/app.py
uid = myuser
numprocesses = 1
autostart = true
stop_signal = TERM

コマンド:

Terminal window
circusd circus.ini
circusctl status
circusctl start myapp
circusctl stop myapp

Supervisord に対する利点:

  • ZeroMQ による更好的なパフォーマンス
  • プロセス変更に素早く応答
  • 活発な開発
  • クロスプラットフォーム

参考資料: Circus Documentation

Procfile ベースのマネージャー

Overmind

Overmind は tmux を使用したモダンなプロセスマネージャーで、複数のプロセスを持つ開発環境に最適です。

インストール:

Terminal window
brew install overmind

Procfile (Procfile):

web: bundle exec rails server
worker: bundle exec sidekiq
redis: redis-server

使用方法:

Terminal window
overmind start

Overmind は各プロセスを独自のウィンドウで tmux セッションを作成し、標準的な tmux コマンドでアクセスできます。

最適用途: 開発環境、マルチプロセスアプリケーション、ターミナルベースのワークフロー。

参考資料: Overmind GitHubControl Your Dev Processes with Overmind

Honcho (Python) と Foreman (Ruby)

Honcho (Python):

Terminal window
pip install honcho
honcho start

Foreman (Ruby):

Terminal window
gem install foreman
foreman start

両方とも Overmind と同じ Procfile 形式をサポートしますが、tmux TUI はありません。

その他の手法

nohup

クイックバックグラウンドタスク用:

Terminal window
nohup node app.js &

最適用途: クイックテスト、シンプルなバックグラウンドタスク、一時的な実行。

screen/tmux

永続的なターミナルセッション用:

Terminal window
screen -S mysession
# または
tmux new -s mysession

最適用途: インタラクティブセッション、リモートワーク、長時間実行するターミナルプロセス。

総合的な比較: 長所と短所

ツール説明長所短所
launchdmacOS ネイティブ init システム✅ macOS ネイティブ
✅ インストール不要
✅ システム更新後に残る
✅ 最も信頼性が高い
✅ 完全なシステム統合
❌ XML 設定は冗長
❌ 学習曲線が急
❌ デバッグが困難
❌ コミュニティツールが限定的
brew servicesHomebrew サービスラッパー✅ 非常にシンプルなインターフェース
✅ ワンコマンドインストール
✅ Homebrew ユーザーに馴染みやすい
✅ plist を自動生成
❌ Homebrew が必要
❌ カスタマイズが限定的
❌ 本番環境には不向き
❌ 隠れた複雑さ
PM2Node.js プロセスマネージャー✅ Node.js 向けに設計
✅ クラスタリングサポート
✅ 優秀な監視機能
✅ クラッシュ時自動再起動
✅ ゼローダウンタイム再起動
❌ Node.js 専用
❌ 追加のソフトウェア依存
❌ メモリーオーバーヘッド
❌ 機能学習曲線
Foreverシンプルな Node.js 存続機能✅ 非常に軽量
✅ シンプルで使いやすい
✅ リソース使用量が低い
❌ 最小限の機能
❌ 監視ダッシュボードなし
❌ クラスタリングなし
❌ 手動再起動のみ
SupervisordPython プロセスマネージャー✅ 成熟して安定
✅ 言語に依存しない
✅ Web 監視インターフェース
✅ プロセスグルーピング
❌ 古いアーキテクチャ
❌ 設定の複雑さ
❌ モダンな代替手段より低速
❌ 開発があまり活発でない
Circusモダンな Python プロセスマネージャー✅ より良いパフォーマンス
✅ 通信に ZeroMQ
✅ 活発な開発
✅ クロスプラットフォーム
❌ コミュニティが小さい
❌ Supervisord ほど成熟していない
❌ 異なる設定形式
❌ チュートリアルが少ない
OvermindProcfile ベースの開発マネージャー✅ tmux による優れた TUI
✅ 標準的な Procfile 形式
✅ 開発に最適
✅ 視覚的なプロセス制御
❌ tmux 依存
❌ 本番環境には不向き
❌ ターミナルアクセスが必要
❌ macOS 固有の癖
HonchoPython Procfile マネージャー✅ クロスプラットフォーム
✅ シンプルなインターフェース
✅ 純粋な Python
❌ TUI なし
❌ Overmind ほど普及していない
❌ 最小限の機能
ForemanRuby Procfile マネージャー✅ オリジナルの Procfile ツール
✅ 実績あり
✅ 大規模なコミュニティ
❌ Ruby 依存
❌ 古いコードベース
❌ TUI なし
❌ 代替手段より低速
cronUnix ジョブスケジューラー✅ お馴染みの構文
✅ クイックタスクにシンプル
✅ どこでも動作 (Unix)
❌ macOS では非推奨
❌ ネイティブ macOS 統合なし
❌ エラー処理が貧弱
❌ スリープ/ウェイクをうまく処理しない
nohupUnix バックグラウンドコマンド✅ Unix に組み込み
✅ インストール不要
✅ テストにクイック
❌ 自動再起動なし
❌ 監視なし
❌ 端末終了時に失われる
❌ 手動プロセス管理のみ
screen/tmuxターミナルマルチプレクサー✅ 永続的なセッション
✅ リモートワークに最適
✅ 複数のウィンドウ
❌ 自動化には不向き
❌ ターミナルアクセスが必要
❌ 手動プロセス管理
❌ セッションベース(サービスではない)

決定フレームワーク

ユースケースによる選択

シナリオ推奨ツール理由
本番システムサービスlaunchdネイティブ、信頼性、再起動後に残る
Procfile による開発OvermindTUI、簡単なプロセス管理
Node.js 本番環境PM2クラスタリング、監視、自動再起動
Node.js シンプル/開発Foreverシンプル、軽量
Python 本番環境Circus/SupervisordPython ネイティブ、成熟
データベース/Redisbrew servicesシンプル、Homebrew 統合
一回限りのバックグラウンドタスクnohup組み込み、セットアップ不要
本番スケジュールタスクlaunchdネイティブ、より多くの機能
クロスプラットフォーム開発Honchoどこでも動作

スキルレベルによる選択

ユーザープロフィール最初にこれから次に展開
macOS ネイティブ重視launchdbrew services
Node.js 開発者PM2システム統合のために launchd
Python 開発者Circusデータベース用に brew services
DevOps エンジニアlaunchdSupervisord/Circus
初心者brew servicesPM2 または launchd
パワーユーザーOvermind必要に応じてすべてのツール

統合ストラテジ

PM2 と launchd の統合:

Terminal window
pm2 startup darwin # launchd plist を作成
pm2 save # 現在のプロセスリストを保存

brew services と launchd の統合: brew services は自動的に launchd plist を作成します。

Overmind と Docker の統合: ローカルプロセスには Overmind、コンテナには Docker、スクリプトで調整します。

結論

macOS はプロセス自動化のための豊富なツールキットを提供しています:

  1. ほとんどのユーザー向け: シンプルさのために brew services から始める
  2. 本番環境向け: launchd を直接使用するか、ツール統合(PM2 startup)を通じて使用
  3. Node.js 向け: PM2 が業界標準
  4. Python 向け: Supervisord または Circus
  5. 開発向け: Overmind が優れたワークフローを提供

重要なのは、特定のユースケースと環境に適したツールを選択することです。launchd のようなネイティブツールは macOS との最も信頼性の高い統合を提供し、PM2 のような言語固有のツールはそのエコシステム向けの専門機能を提供します。


カバー画像: launchd アーキテクチャ、brew services インターフェース、PM2 ダッシュボード、比較表を含む macOS 自動化ツールの技術図。

参考資料: