サービス管理したい(launchctl

$ launchctl list
$ launchctl list | rg ラベル名

macOSのサービス関係を管理するコマンドです。

listコマンドで、現在ロードされているプロセスの一覧(PIDStatusLabelなど)を確認できます。 ずらーっと表示されるため、greprgなどの検索コマンドにパイプして使うのがよいと思います。 サービスの設定ファイルは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>などを使うことができます。 詳しくはドキュメントを参照することをオススメします。

ファイル置き場

  1. ~/Library/LaunchAgents/ラベル.plist(ユーザーごと)

  2. /Library/LaunchAgents/ラベル.plist(ユーザーごと;sudoが必要)

  3. /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を使って設定します。 頻度のキーとしてMinuteHourDayWeekdayMonthがあります。 毎週実行したい場合は、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/に保存しています。

リファレンス