Macでプロセス停止時の再起動を実現するには

CentOSなどではsystemdのRestartの設定でプロセス停止時の再起動が実現できる。 MacではlaunchdのplistのKeepAliveで指定できる。

launchd実行の仕組み

launchdではplistというファイルにプロセスの設定を記載し、launchctlコマンド経由でlaunchdに対して設定の読み込み、プロセスの起動などを指示する。

plistの場所

plistはプロセスの種類によって以下のような場所に格納する。

場所 説明
~/Library/LaunchAgents ユーザが提供するユーザごとのエージェント
/Library/LaunchAgents 管理者が提供するユーザごとのエージェント
/Library/LaunchMaemons 管理者が提供するシステムワイドのデーモン
/System/Library/LaunchAgents OSが提供するユーザごとのエージェント
/System/Library/LaunchDaemon OSが提供するシステムワイドのデーモン

今回は自分で作ったプロセスなので「~/Library/LaunchAgents」配下に作成した。 自分の場合は~/Library配下に該当のフォルダがなかったので自分で作成した。

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.hoge.process</string>
        //実行プロセス
        <key>Program</key>
        <string>/nanika/no/program</string>
        //サーバ起動時に起動
        <key>RunAtLoad</key>
        <true/>
        //落ちたら再起動
        <key>KeepAlive</key>
        <true/>
        //ワーキングディレクトリ
        <key>WorkingDirectory</key>
        <string>/working/directory</string>
        //標準エラー
        <key>StandardErrorPath</key>
        <string>/log/wo/hakutokoro/Error.log</string>
        //標準出力
        <key>StandardOutPath</key>
        <string>/log/wo/hakutokoro/Std.log</string>
        <dict>
            //環境変数
            <key>PATH</key>
            <string>/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin</string>
        </dict>
    </dict>
</plist>

このKeepAliveでプロセス停止時の再起動を実現できる。

標準エラーや標準出力は特に最初の起動確認では重宝するので設定をお勧めする。

自分の場合は環境変数を指定しないと以下のようなエラーが標準エラーのログに出力された。

env: node: No such file or directory

環境変数をplistに書くことで解消した。

launchctlコマンド例

plistのload/unload

launchctl load xxx.plist
launchctl unload xxx.plist

設定したplistの内容を実行/停止

launchctl start xxx.plist
launchctl stop xxx.plist

参考

以下のサイトなどがわかりやすかった。

MacOSのデーモンをマスターしよう:Launchdプロセス #MacOSX - Qiita

launchd, launchctlについて(導入編) · GitHub