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
参考
以下のサイトなどがわかりやすかった。