MacOSのlaunchdで定期処理を登録する

こんにちは。からすぱんです。

春ですね。早いものでコロナ時代も今春で3年目を迎えました。コロナよりも何よりも、人間の暴挙が一番怖いですが。

さて、今回はMacOSのlaunchd機能を使って定期処理を登録・実行する方法についてです。実行する定期処理はスクリプト言語やコマンドラインツールのターゲット(ターゲットについてはこちらにて解説しています。)等が登録可能です。

そもそもlaunchdとは?

Windowsを基本的に使っている身としては、launchdってなんぞ?という疑問しか湧かなかったので、頼みのwikiに聞いてみました。

launchdは、デーモン、アプリケーション、プロセス、スクリプトの起動・停止・管理を行う、オープンソースのサービス管理フレームワークである。AppleのDave Zarzyckiによって作られ、Mac OS X Tiger (Mac OS X v10.4) で導入された。Apache Licenseのもとで公開されている。

https://ja.wikipedia.org/wiki/Launchd

はい、出ました「デーモン」。Windowsにはあまりなじみがない言葉です。これもwikiに聞いてみました。

デーモン (英語: Daemon) は、UNIX, Linux, Mac OS XなどUnix系のマルチタスクオペレーティングシステム (OS) において動作するプロセス(プログラム)で、主にバックグラウンドで動作するプロセス[1]。ユーザが直接対話的に制御するプログラムもデーモンとして作ることができる[2]。典型的なデーモンは名前の最後尾に “d” が付く。例えば、syslogd はシステムログを扱うデーモン、sshd は内外のSSH接続要求を受け付けるデーモンである。

https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%83%A2%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)

なるほど。

デーモンとはWindowsで言うところのサービスのようなものってことですね。スクリプトやアプリケーションをlaunchdに登録することで常駐サービスのように定期実行することができると。

なるほど。

では、スクリプトをlaunchdに登録する方法を解説していきます。


1.設定ファイルを作成する

まずは、plist形式(xml)で設定ファイルを作成します。

主なxmlのキーは下記の通り。

key設定内容必須
Labelstring 起動するジョブを一意に識別するためのキー。
UserNamestringジョブを実行するユーザーを指定する。このキーは launchdがrootで実行されているときに適用される。
Programstring実行するプログラムを指定する。このキーがない場合、ProgramArgumentsキーで指定されたプログラムが実行される。✓( ProgramArguments キーが無い場合)
ProgramArgumentsarray of strings実行するプログラムとパラメータ指定する。このキーがない場合、Programキーで指定されたプログラムが実行される。 ✓( Programキーが無い場合)
StartIntervalintegerプログラム実行間隔を秒数で指定する。
StartCalendarIntervaldictプログラム実行時刻を指定する。
  Hourinteger プログラム実行時刻(時)を指定する。
  Minuteinteger プログラム実行時刻(分)を指定する。
UserNamestringプログラムを実行するユーザーを指定する。
StandardOutPathstring標準出力先を指定する。
StandardErrorPathstringエラー出力先を指定する。

シェルスクリプトhogehogeを60秒間隔でrootユーザ権限で実行するためのplistはこんな感じ。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>hogehoge</string>
	<key>UserName</key>
	<string>root</string>
	<key>ProgramArguments</key>
	<array>
		<string>sudo</string>
		<string>bash</string>
		<string>-c</string>
		<string>/Library/hogehoge.sh</string>
	</array>
	<key>StartInterval</key>
	<integer>60</integer>
    <key>StandardOutPath</key>
	<string>/Document/out-hogehoge.log</string>
	<key>StandardErrorPath</key>
	<string>/Document/err-hogehoge.log</string>

</dict>
</plist>

2.launchd に登録する

設定ファイルを置く場所に応じて用途が異なります。

~/Library/LaunchAgents/.plistユーザーごと設定できるエージェント
/Library/LaunchAgents/.plist管理者用のエージェント
/Library/LaunchDaemons/.plistシステム共通のデーモン(rootがオーナー)

システム共通のデーモンとして実行させたい場合、こちらをターミナルで実行します。

sudo launchctl load /Library/LaunchDaemons/hogehoge.plist

エージェントとして実行させたい場合、こちらを実行します。

launchd load /Library/LaunchAgents/hogehoge.plist

デーモンの登録解除を行う場合はこちらを実行します。

sudo launchctl unload /Library/LaunchDaemons/hogehoge.plist

エージェントの登録解除はこちらを実行します。

launchd unload /Library/LaunchAgents/hogehoge.plist

ざっくりですが、MacOSのlaunchdで定期処理を登録する方法解説でした。

いかがだったでしょうか。

Windowsばかり使っていると、MacやLinaxには標準搭載の機能の情報が入ってこないので、いろいろなOSを使って開発をするのはなかなか勉強になるなと思いました◎

それでは。