サービス管理したい(launchctl)
$ launchctl list
$ launchctl list | rg ラベル名
launchctlはmacOSで使用するサービス管理コマンドです。
launchdデーモンを管理するコマンドで、
システム起動時にサービスを開始したり、
サービスの開始・停止・リロードしたりできます。
listコマンドで、現在ロードされているプロセスの一覧(PID、Status、Labelなど)を確認できます。
ずらーっと表示されるため、grepやrgなどの検索コマンドにパイプして使うのがよいと思います。
サービスの設定ファイルはplist(property list)というXML形式で作成します。
定期的に実行したい自前のスクリプトも登録できます。
macOSではcontabよりlaunchdの利用が推奨されています。
サービスを起動/停止したい
$ launchctl start スクリプト名
$ launchctl stop スクリプト名
start / stopコマンドで、サービスを手動で起動/停止できます。
サービスを有効/無効にしたい
$ launchctl load ~/Library/LaunchAgents/ラベル.plist
$ launchctl unload ~/Library/LaunchAgents/ラベル.plist
loadコマンドで、サービスの自動起動を有効にできます。
自動起動が有効になっていると、ログインしたときや再起動後に自動でサービスが起動します。
unloadコマンドで無効にできます。
カスタムのplistを作成したい
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>キー</key>
<string>値</string>
</dict>
</plist>
plistは、最初にXMLとDTDの宣言が必要です。
内容は、基本的にはキーと値のペアで記述します。
値には<array>や<dict>などを使うことができます。
詳しくはドキュメントを参照することをオススメします。
ファイル置き場
~/Library/LaunchAgents/ラベル.plist(ユーザーごと)/Library/LaunchAgents/ラベル.plist(ユーザーごと;sudoが必要)/Library/LaunchDaemons/ラベル.plist(システム全体;sudoが必要)
plistファイルは上記のいずれかに作成します。
LaunchDaemonsはシステム全体、LaunchAgentsはユーザーに紐づいています。
基本的には、最初のパスに作成すればOKです。
ラベルを作りたい(Label)
<key>Label</key>
<string>ラベル名</string>
ファイル名につけるラベルは、すでに存在しているplistファイルを参照して命名するとよいと思います。
たとえばAdobeCCに関係するファイルはcom.adobe.AdobeCreativeCloud.plistとなっています。
これに倣って、僕はlocal.スクリプト名.plistとしています。
スクリプトを指定したい(ProgramArguments)
<key>ProgramArguments</key>
<array>
<string>実行したい/スクリプト/の/絶対/パス</string>
<string>スクリプトのオプション</string>
<string>スクリプトの引数</string>
</array>
実行するスクリプトはProgramArgumentsで設定できます。
コマンドラインに打ち込む内容を、オプションや引数を含めてarrayの形式で並べて記述します。
複雑な内容を書くのは大変なので、別途シェルスクリプトなどにまとめておくのがよいと思います。
KeepAlive
<key>KeepAlive</key>
<true/>
定期実行したい(StartCalendarInterval)
<key>StartCalendarInterval</key>
<dict>
<key>Minutes</key>
<integer>20</integer>
<key>Hour</key>
<integer>13</integer>
<key>Day</key>
<integer>3</integer>
</dict>
日時を指定して定期実行したい場合はStartCalendarIntervalを使って設定します。
頻度のキーとしてMinute、Hour、Day、Weekday、Monthがあります。
毎週実行したい場合は、Weekdayに0から7の値を指定します(0と7は日曜日に相当)。
実行した時刻を起点に定期実行する場合はStartIntervalを使います。
環境変数を設定したい(EnvironmentVariables)
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
</dict>
実行ログを残したい(StandardOutPath / StandardErrorPath)
<key>StandardOutPath</key>
<string>/tmp/ラベル.stdout</string>
<key>StandardErrorPath</key>
<string>/tmp/ラベル.stderr</string>
定期実行した結果はファイルに保存できます。
StandardOutPathは標準出力、StandardErrorPathは標準エラー出力を保存するファイル名を指定します。
ログはずっと残っていなくてもよいと考えて、僕は/tmp/に保存しています。