こんにちは。からすぱんです。
春ですね。早いものでコロナ時代も今春で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 | 型 | 設定内容 | 必須 |
Label | string | 起動するジョブを一意に識別するためのキー。 | ✓ |
UserName | string | ジョブを実行するユーザーを指定する。このキーは launchdがrootで実行されているときに適用される。 | |
Program | string | 実行するプログラムを指定する。このキーがない場合、ProgramArgumentsキーで指定されたプログラムが実行される。 | ✓( ProgramArguments キーが無い場合) |
ProgramArguments | array of strings | 実行するプログラムとパラメータ指定する。このキーがない場合、Programキーで指定されたプログラムが実行される。 | ✓( Programキーが無い場合) |
StartInterval | integer | プログラム実行間隔を秒数で指定する。 | |
StartCalendarInterval | dict | プログラム実行時刻を指定する。 | |
Hour | integer | プログラム実行時刻(時)を指定する。 | ✓ |
Minute | integer | プログラム実行時刻(分)を指定する。 | ✓ |
UserName | string | プログラムを実行するユーザーを指定する。 | |
StandardOutPath | string | 標準出力先を指定する。 | |
StandardErrorPath | string | エラー出力先を指定する。 |
シェルスクリプト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を使って開発をするのはなかなか勉強になるなと思いました◎
それでは。