macOSのlaunchdを使ってスクリプトをスケジュール実行する方法
launchdは、スクリプトやプロセスを起動・停止・管理するためのツールです。Linuxを使ったことがある方ならcronをご存じでしょうが、launchdはいわば「macOS版のcron」にあたる存在です。本記事では、launchdの基本的な仕組みから、実際にスクリプトをスケジュール実行するまでの手順を解説します。
デーモン(daemon)とは?
デーモン(daemon)とは、バックグラウンドで動作するスクリプトのことです。通常のアプリケーションと異なり、デーモンはプロセスとして動作し、ユーザーや他のアプリケーションから直接操作されることはありません。macOSでは、これらはlaunchdフレームワークの管理下に置かれ、いつ起動し、いつ停止するかをlaunchdが判断します。
なお、「daemon」という少し変わった名前は、熱力学の思考実験である「マクスウェルの悪魔(Maxwell's demon)」に由来しています。これは分子を選別する架空の存在で、そこからこの名前が付けられました。
スクリプトを作成する
launchd経由でデーモンを実行するには、まずスクリプトを作成する必要があります。最も一般的に使われるスクリプト言語はbashです。bashスクリプティングについて詳しく学びたい方は、初心者向けのbashチュートリアルなどを参考にするとよいでしょう。
launchdを使う
launchdでは、スクリプトは「ジョブ定義(job definition)」によってトリガーされます。ジョブ定義は特定のディレクトリに保存された.plistファイルで、XML形式で記述されています。このファイルにはジョブの名前、起動するスクリプトのパス、そしてスクリプトを実行するタイミングを指定します。スクリプトを書いたら、適切なタイミングでそれを起動するジョブ定義を作成し、読み込ませます。
ジョブ定義は以下のような形式になります。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>local.restart</string>
<key>Program</key>
<string>/Users/user/Scripts/restart.sh</string>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
必要に応じて内容を編集し、拡張子.plistのテキストファイルとして保存したうえで、正しいディレクトリに配置してください(配置場所については後述します)。
ジョブ定義には、いくつかの重要な要素があります。
- Label: launchd内でのジョブ名です。各ジョブごとに一意である必要があります。逆ドメイン表記で記述するのが慣例で、個人用のエージェントには「local」ドメインを使うのが便利です。
- Program: このジョブ定義が起動するスクリプトのフルパスです。
- RunAtLoad: スクリプトをいつ実行するかを指定します。主なオプションは以下の通りです。
- RunAtLoad: ジョブ定義が読み込まれた直後に実行します。読み込みごとに1回だけ実行されます。
- StartInterval: n秒ごとにジョブを起動します。次の例では7200秒(2時間)ごとに実行されます。
<key>StartInterval</key> <integer>7200</integer>
- StartCalendarInterval: 特定の日時にジョブを実行します。次のコードでは毎日午前9時に実行されます。
<key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>9</integer> <key>Minute</key> <integer>0</integer> </dict>
エージェント(Agent)とデーモン(Daemon)の違い
ジョブ定義を書き終えたら、適切なディレクトリに保存する必要があります。
launchdはさらに、エージェント(agent)とデーモン(daemon)を区別しています。エージェントはログイン中のユーザーの権限で実行され、一方デーモンはrootユーザー権限で実行されます。つまり、特定のユーザーアカウントだけでスクリプトを実行したい場合はエージェントを、誰がログインしていようと常に実行したい場合はデーモンを使います。
エージェントとデーモンの違いは、コンピュータ上のどこに保存されるかによって決まります。
- 「~/Library/LaunchAgents」: ログイン中のユーザーの権限で実行される
- 「/Library/LaunchDaemons」: rootユーザーの権限で実行される
作成したplistファイルは、用途に応じて正しい場所に保存してください。
ジョブをlaunchctlに読み込む
スクリプトを作成し、エージェントを正しい場所に保存したら、それをlaunchctlに読み込む必要があります。一度読み込んでおけば、以降のログイン時には自動的に読み込まれます。
現在launchctlで何が実行されているかを確認するには、ターミナルでlaunchctl listコマンドを使用します。表示される一覧は非常に長いため、grepと組み合わせて自分のスクリプトだけを抽出すると便利です。
launchctl list | grep local.restart
スクリプトを読み込むには、ターミナルを開いて次のコマンドを実行します。
launchctl load ~/Library/LaunchAgents/local.restart.plist
逆に、launchctlのキューからスクリプトを取り除くには、unloadコマンドを使います。
launchctl unload ~/Library/LaunchAgents/local.restart.plist
ジョブを読み込むと、それはlaunchdのキューに入り、ジョブ定義に記載された実行条件を満たした時点で自動的に実行されます。しかし、条件を待たずに今すぐ実行したい場合は、「start」コマンドを使います。
launchctl start local.restart
このコマンドにはジョブのラベルを指定します。なお、ジョブがあらかじめlaunchctlに読み込まれていないと機能しない点に注意してください。
まとめ
launchdを活用すれば、不要ファイルの自動整理、サーバーの定期再起動、特定のファイルが出現したときのアプリ起動など、さまざまなタスクを自動化できます。launchdについてさらに深く学びたい方は、公式ドキュメントや詳細なチュートリアルも併せて参照することをおすすめします。
-
macOSでターミナル(コマンドライン)を使う方法|基本操作と便利なコマンドを解説
Windowsに「コマンドプロンプト」があるように、macOSにはコマンドの実行やシステム変更に使える「ターミナル」が標準搭載されています。ターミナルはmacOS専用のコマンドラインアプリケーションで、システム設定の変更、ファイルやアプリの起動、さまざまなタスクの実行などに活用できます。Appleが開発したこのアプリは、macOSの標準アプリとして最初からインストールされており、OSをアップデートしても常に同梱されています。ターミナルアプリはMacの「ユーティリティ」フォルダ内にあります。 つまり、ターミナルはMac版のコマンドプロンプトです。「Macでコマンドラインにはどうやってアクセスす
-
macOS Catalinaの新セキュリティ機能を徹底活用!知っておきたい設定方法と使い方ガイド
Appleは数か月前、Mac向けの最新OS「macOS Catalina」をリリースしました。Mojaveの後継にあたるこのバージョンは、Apple史上最大級の大型アップデートとなっています。iPadをMacのサブディスプレイとして使える「Sidecar」、自動的に切り替わるダークモード、大幅にリニューアルされた「メモ」アプリなど、革新的な機能が多数搭載されているだけでなく、プライバシーとセキュリティの強化も大きく進化しました。 セキュリティの面で注目すべきは、T2セキュリティチップの存在です。このチップはアクティベーションロックとして機能し、MacBookを格段に安全なものにしてくれます。