サービス管理したい(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/
に保存しています。