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