launchdを使用してMacでスクリプトをスケジュールする方法

タスクを自動化するためにスクリプトをスケジュールすることは、多くの管理者が日々頼りにしている強力な機能です。一般的なMacユーザーも、macOSでのタスク自動化と管理のためのAppleの推奨ツールであるlaunchdを使用してこの力を活用できます。特定の時間にWi-Fiをオフにするような簡単なタスクのスケジュールから、複雑なシステムバックアップの実行まで、Macのlaunchdはワークフローを自動化し、時間を節約し、システムが自分の好みに合わせて動作するようにするのに役立ちます。
目次
- launchdとは?
- デーモンとエージェント
- スクリプトの作成
- ジョブの説明
- launchctlへのジョブの読み込み
- よくある質問
launchdとは?
オーケストラが多様な楽器を指揮し調和させるために指揮者を必要とするように、macOS Venturaは無数のプロセスとサービスを持ち、すべてが完璧に調和して動作するようにlaunchdに依存しています。コンピュータを起動したときにmacOSカーネルによって最初に起動されるプロセスとして、launchdは中心的な役割を果たし、次に続くすべてのプロセス、サービス、アプリケーションを指揮します。これは、指揮者がシンフォニーの開始を合図するように、最初のバトンを上げることに似ています。
システムのオーケストレーションにおける役割を超えて、launchdは特定のタスクを実行するために書かれたコマンドのシリーズであるスクリプトをスケジュールするためにも使用できます。これは、ユーザーがlaunchdという指揮者にコミュニケーションを取り、指示を出すためのインターフェースとして機能するlaunchctlコマンドを使用して行います。
知っておくべきこと: トレントをダウンロードしていますか?Macのターミナルを使用してトレントをダウンロードすることで効率を向上させましょう。
デーモンとエージェント
launchdは時々デーモンと呼ばれます。デーモンはバックグラウンドプロセスとして実行され、通常はユーザーによって直接制御されることを目的としていないコンピュータプログラムです。デーモンの中でも、launchdは特別です。なぜなら、macOSのすべての他のデーモンの指揮者であり、いつそれらが開始され、停止されるかを決定できるからです。これらの従属的なデーモンはrootユーザーの下で実行されるため、ほぼ何でも行うことができます。

しかし、タスクスケジューリングに興味があるユーザーにとって、rootユーザーの下でスクリプトを実行することは常に望ましいわけではありませんし、必要でもありません。ここでエージェントが登場します。エージェントはログインしているユーザーの代理として実行され、より制限された環境を提供し、その特定のユーザーの権限と設定でスクリプトやタスクが実行されることを保証します。たとえば、アカウント内の設定を変更したりファイルにアクセスしたりするスクリプトを実行したい場合は、エージェントを使用します。
ヒント: お気に入りの古いMacアプリのいくつかで互換性の問題に直面していますか?古いMacに32ビットLinuxをインストールする方法を見つけましょう。
スクリプトの作成
エージェントやデーモンをlaunchd経由で実行するには、いくつかのスクリプトを書く必要があります。最も一般的なスクリプト言語はbashです。bashスクリプトについてもっと学びたい場合は、初心者向けのbashスクリプトガイドをチェックできます。

launchdスクリプトは、エージェントとして実行されることを意図しているか、デーモンとして実行されることを意図しているかによって、2つの異なる場所に保存できます。
- ログインしているユーザーの代理として機能することを意図したスクリプトは、「~/Library/LaunchAgents」に保存する必要があります。
- 逆に、ログインユーザーに関係なくシステム全体で機能することを意図したデーモンとして機能するスクリプトは、「/Library/LaunchDaemons」に保存されます。
エージェントはroot権限を持たないため、深いシステムアクセスを必要とするタスクを実行することはできません。一方、デーモンはroot権限で実行され、システム全体に影響を与えるタスクを処理できます。
知っておくべきこと: Rootユーザーを有効にすることでMacをより深く制御でき、全ファイルシステムにアクセスできます。
ジョブの説明

launchdのスクリプトは、特定のディレクトリに保存された.plistファイルであるジョブ定義によってトリガーされます。これらのXMLファイルは、ジョブに名前を付け、起動すべきスクリプトを指定し、スクリプトが実行されるべき時期を示します。スクリプトを書いたら、適切な時期にスクリプトを起動するジョブ定義を書いて読み込みます。ジョブ定義は次のようになります。
version="1.0"encoding="UTF-8"?>
version="1.0">
>
>Label>
>local.restart>
>Program>
>/Users/user/Scripts/restart.sh>
>RunAtLoad>
/>
>
>必要に応じて修正し、.plist拡張子のあるテキストファイルに保存してから、正しいディレクトリに移動します(上記参照)。
ジョブの説明にはいくつかの重要な部分があります。
- Label: launchd内のジョブの名前。各ジョブに対して一意である必要があります。これらは逆ドメイン表記で書かれ、「local」はプライベートエージェントにとって素晴らしいドメインです。
- Program: このジョブ定義が起動するスクリプトの完全なパス。
- RunAtLoad: スクリプトが実行されるべき時期を説明します。ここにはいくつかの異なるオプションがあります: - RunAtLoad: ジョブ定義が読み込まれるとすぐに実行されます。読み込みごとに1回のみ実行されます。
- StartInterval: ジョブをn秒ごとに開始します。
- StartCalendarInterval: 特定の日時にジョブを実行します。
ヒント: スクリプトファイルのためにもっとスペースが必要ですか?Macのキャッシュをクリアしてすぐにスペースを解放する方法を学びましょう。
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に読み込まれている場合にのみ機能します。
ヒント: RaycastやAlfredを使用してお気に入りのアプリを迅速に起動することで、Macのパワーユーザーになりましょう。
よくある質問
launchdがスクリプトを開始したかどうかを確認するにはどうすればよいですか?
ターミナルでlaunchctl listコマンドを使用できます。これにより、すべての読み込まれたジョブが表示されます。特定のスクリプトやジョブを見つけるには、grepを使用します。たとえば、launchctl list | grep your_script_name。
launchdがシステムリソースを過剰に使用している場合はどうすればよいですか?
launchdが過剰なリソースを消費している場合、通常は不具合のあるスクリプトやジョブが原因です。最近追加したスクリプトを確認し、launchctl unload /path/to/job.plistを使用してアンロードしてください。
cronとlaunchdの違いは何ですか?
cronとlaunchdはどちらもスケジューリングサービスですが、動作が異なります。cronは、crontabファイルで定義された固定の時間または間隔でジョブを実行する古いUnixベースのジョブスケジューラです。launchdは、さまざまなトリガーに基づいてジョブを開始できるAppleの新しいmacOSシステムです。時間だけではありません。
bash以外のスクリプト言語をlaunchdで使用できますか?
launchdは、ターミナルから実行できる任意のスクリプトを実行できます。これには、Python、Perl、Ruby、その他の言語で書かれたスクリプトが含まれます。
画像クレジット: Pexels。すべてのスクリーンショットはDavid Moreloによるものです。