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

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

スクリプトのスケジュール設定によるタスクの自動化は、多くの管理者が毎日利用している強力な機能です。通常の Mac ユーザーは、macOS でのタスクの自動化と管理に Apple が推奨するツールである launchd を使用して、この機能を活用することもできます。特定の時間に Wi-Fi をオフにするなどの単純なタスクのスケジュール設定から、複雑なシステム バックアップの実行まで、Mac の launchd を使用すると、ワークフローを自動化し、時間を節約し、システムを希望通りに実行できるようにすることができます。

何が発売されるのか?

オーケストラがさまざまな楽器を導き、調和させるために指揮者を必要とするのと同じように、無数のプロセスとサービスを備えたmacOS Ventura は、すべてが完璧なコンサートで演奏されることを保証するために launchd に依存しています。コンピューターの起動時に macOS カーネルによって起動される最初のプロセスとして、launchd が中心的な役割を果たし、最初の指揮棒を上げて交響曲の始まりを合図する指揮者のように、後続のすべてのプロセス、サービス、アプリケーションを調整します。

システム オーケストレーションにおける役割を超えて、launchd を使用して、特定のタスクを実行するために作成された一連のコマンドであるスクリプトをスケジュールすることができます。これはlaunchctl、ユーザーが通信し、起動されるコンダクタに指示するためのインターフェイスとして機能するコマンドを使用して行われます。

デーモンとエージェント

launchd は、バックグラウンド プロセスとして実行されるコンピューター プログラムであるデーモンと呼ばれることもありますが、通常はユーザーが直接制御するように設計されていません。デーモンに関して言えば、launchd は他のすべての macOS デーモンのマエストロであり、起動と停止のタイミングを決定できるため特別です。これらの従属デーモンは root ユーザーの下で実行されるため、ほぼ何でも行うことができます。

マクスウェル・デーモン Wiki グラフィック
画像出典:ウィキペディア

ただし、タスクのスケジュールに興味があるユーザーにとって、root ユーザーでスクリプトを実行することが常に望ましい、または必要であるとは限りません。ここでエージェントが活躍します。エージェントは、ログインしているユーザーに代わって実行され、より制限された環境を提供し、スクリプトやタスクがその特定のユーザーの権限と設定で確実に実行されるようにします。たとえば、設定を変更したり、アカウント内のファイルにアクセスしたりするスクリプトを実行したい場合は、エージェントを使用します。

スクリプトの作成

launchd を介してエージェントまたはデーモンを実行するには、いくつかのスクリプトを作成する必要があります。最も一般的なスクリプト言語は bash です。bash スクリプトについてさらに詳しく知りたい場合は、bash スクリプトの初心者向けガイドを参照してください。

launchd-code-scriptto

launchd スクリプトは、エージェントとして実行することを目的としているか、デーモンとして実行することを目的としているかに応じて、次の 2 つの異なる場所に存在できます。

  • ログインユーザーに代わって動作するエージェントとしてのスクリプトの場合は、「~/Library/LaunchAgents」に保存する必要があります。
  • 逆に、ログインしているユーザーに関係なく、オペレーティング システム全体でデーモンとして機能することを目的としたスクリプトは、「/Library/LaunchDaemons」に属します。

エージェントには root 権限がないため、システムへの深いアクセスを必要とするタスクを実行できないことに注意してください。一方、デーモンは root 権限で実行され、システム全体に影響を与えるタスクを処理できます。

職務内容

launchd-scripts-ジョブの説明

launchd のスクリプトは、ジョブ定義によってトリガーされます。plist ファイルは特定のディレクトリに保存されます。これらの XML ファイルはジョブに名前を付け、起動するスクリプトを指定し、スクリプトをいつ実行するかを示します。スクリプトを作成したら、適切なタイミングでスクリプトを起動するジョブ定義を作成してロードします。ジョブ定義は次のようになります。

<?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>local.restart</string>
<key>Program</key>
<string>/Users/user/Scripts/restart.sh</string>
<key>RunAtLoad</key>
<true/>
</dict></plist>

必要に応じて変更し、. plist 拡張子を削除してから、正しいディレクトリにドロップしてください (上記を参照)。

職務内容には重要な部分がいくつかあります。

  • ラベル: launchd 内のジョブの名前。ジョブごとに一意である必要があります。これらは逆ドメイン表記で書かれており、「ローカル」はプライベート エージェントにとって最適なドメインです。
  • プログラム:このジョブ記述が起動するスクリプトのフルパス。
  • 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>

launchctl へのジョブのロード

launchd-scripts-launchctl-list

スクリプトを作成し、エージェントを適切な場所に保存したら、それを にロードする必要がありますlaunchctl。今後、これはログイン時に自動的に行われるようになります。

launchctl listlaucnhctl で現在実行されている内容を確認するには、ターミナルで を使用できます。この巨大なリストは、次のようなラベルを付けることでスクリプトで grep できます。

launchctl list | grep local.restart

スクリプトをロードするには、ターミナルを開き、次のコマンドを使用します。

launchctl load ~/Library/LaunchAgents/local.restart.plist

launchd-scripts-launchctl-load

launchctl キューからスクリプトを削除するには、次のunloadコマンドを使用します。

launchctl unload ~/Library/LaunchAgents/local.restart.plist

launchd-scripts-launchctl-unload

ジョブをロードすると、そのジョブは launchd キューに入れられ、ジョブは起動条件で指定された時刻に実行されます。どうしてもスクリプトをすぐに実行したい場合は、「start」コマンドを使用する必要があります。

launchctl start local.restart

このコマンドはジョブのラベルを取得し、ジョブがすでに にロードされている場合にのみ機能しますlaunchctl

よくある質問

launchd がスクリプトを開始したかどうかを確認するにはどうすればよいですか?

launchctl listターミナルでコマンドを使用できます。これにより、読み込まれたすべてのジョブが表示されます。特定のスクリプトまたはジョブを検索するには、grepなどを使用しますlaunchctl list | grep your_script_name

launchd が使用するシステム リソースが多すぎる場合はどうなりますか?

launchd が過剰なリソースを消費している場合、通常はスクリプトまたはジョブが誤動作していることが原因です。最近追加したスクリプトを確認し、 を使用してアンロードする必要がありますlaunchctl unload /path/to/job.plist

cron と launchd の違いは何ですか?

cron と launchd は両方ともスケジューリング サービスですが、動作が異なります。cron は古い Unix ベースのジョブ スケジューラで、crontab ファイルで定義された固定時間または間隔でジョブを実行します。launchd は Apple の macOS 用の新しいシステムで、時間だけでなくさまざまなトリガーに基づいてジョブを開始できます。

launchd で bash 以外のスクリプト言語を使用できますか?

launchd は、ターミナルから実行できる任意のスクリプトを実行できます。これには、Python、Perl、Ruby、その他の言語で書かれたスクリプトが含まれます。

画像クレジット: Pexels。すべてのスクリーンショットは David Morelo によるものです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です