# サービス管理したい(``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)