Cron ジョブの代わりに Systemd タイマーを使用する

Cron ジョブの代わりに Systemd タイマーを使用する
ノートパソコンの前で目覚まし時計を持っている女性の写真。

Linux ユーザーであれば、cron はよくご存知でしょう。cron は長年にわたり、Unix の時間ベースのジョブ スケジューラとして使用されてきました。現在、多くのユーザーが Systemd タイマーを使用して cron の優位性に取って代わっています。この記事では、独自の systemd タイマーを設定し、それがシステム上で適切に実行されるようにするための基本について説明します。

Cron ではなく Systemd タイマーを使用する理由

Systemd タイマーの最大のセールスポイントの 1 つは、Systemd エコシステムに完全に統合されていることです。つまり、さまざまな Systemd サービス ユニットをスケジュールしてリンクすることが非常に簡単になり、従来の cron デーモンに比べてタスクの自動化が容易になります。

Systemd タイマーを使用するシステム サービスを表示する端末。

Systemd タイマーが Cron より優れているもう 1 つの利点は、スケジュールされたジョブをトリガーする方法をより詳細に制御できることです。たとえば、Systemd タイマーには変数がありOnBootSec、これを使用すると、正常に起動してから一定の時間が経過するまでサービス ユニットを遅延させることができます。

特別なトリガー変数を使用したタイマー設定の例を示す端末。

最後に、Systemd タイマーは、標準の cron デーモンと比べても非常に正確です。デフォルトでは、変数を使用して、ジョブをマイクロ秒単位で追跡および実行できますAccuracySec。これは、スケジュールされたタスクの正確なタイミングを必要とするコンピューターを実行している場合に非常に役立ちます。

Systemd タイマーのインストール

タイマーは Systemd の組み込み機能です。つまり、Arch、Fedora、Ubuntu などの一般的な Linux ディストリビューションの場合のように、Systemd を init デーモンとして使用している場合、マシンはすでに一部のシステム プロセスでこの機能を利用しています。

ディストリビューションが Systemd を実行しているかどうかを確認するには、次のコマンドを実行します。

これを行うと、システム上で現在実行されているすべての Systemd ユニット、デバイス、およびタイマーが一覧表示されます。

Systemd ベースの Linux ディストリビューションで systemctl コマンドの出力を表示する端末。

既存のタイマーを一覧表示する

現在のユーザー アカウントでタイマーが実行されているかどうかを確認する最も簡単な方法は、次のコマンドを使用することです。

--allフラグを使用して、非アクティブなタイマーも含め、システム内のすべてのタイマーをチェックすることもできます。

これを行うと、各タイマーがアクティブになる日時、その時点までのカウントダウン、最後に実行されてから経過した時間、タイマー自体のユニット名、および各タイマー ユニットがアクティブにするサービスが出力されます。

現在のセッションで実行中のすべての Systemd タイマーを一覧表示するターミナル。

新しいサービスとタイマーの作成

Systemd タイマーを作成する最初のステップは、タイマーを接続する既存のサービスを作成するか、見つけることです。これは、すべてのタイマーを親サービス ユニットに接続する必要があるためです。このセクションでは、カスタム Systemd サービス用のタイマーを作成する手順について説明します。

まず、ホーム ディレクトリに空の「.service」ファイルと「.timer」ファイルを作成します。

お気に入りのテキスト エディターを使用して新しいサービス ファイルを開きます。

新しいサービス ファイル内に次のテンプレートを貼り付けます。

「.service」ファイルを保存し、同じテキスト エディターを使用して空の「.timer」ファイルを開きます。

次のコード ブロックをタイマー ファイル内に貼り付けます。

セクションに移動し[Timer]、変数の値をOnCalendarSystemd ユニットを実行する日付と時刻に置き換えます。私の場合は、プログラムを毎日午前 11 時 43 分に正確に実行します。

OnCalendar 変数のカスタム タイマー値を強調表示するターミナル。

単調なタイマーの作成

特定の日付に実行されるタイマーを設定する以外に、コンピューターの現在の稼働時間に応じて実行される単調なタイマーを作成することもできます。これは、デスクトップやラップトップなど、常に実行されていないマシンでタスクをスケジュールする場合に便利です。

まず、「.timer」ファイルを開き、セクションまで下にスクロールします[Timer]

場所を強調表示する端末

OnCalendar変数と変数の両方を削除しPersistent、 を追加してOnBootSec、ユニット ファイルを実行する時間間隔を指定します。たとえば、これを「1hr」に設定すると、コンピューターが正常に起動してから 1 時間後に Systemd にコマンドを開始するように指示します。

カスタム タイマー ファイルの元のタイミング変数を置き換える OnBootSec 変数を強調表示するターミナル。

OnUnitActiveSecすぐ下に変数を追加しOnBootSec、システムの起動後にタイマーを継続的に実行する間隔を指定します。私の場合は、タスクを最初の実行後 30 分ごとに実行したいので、「30 分」に設定します。

単一実行タイマーを単調タイマーに変換する OnUnitActiveSec 変数を強調表示するターミナル。

一時タイマーの作成

Systemd タイマーが Systemd に深く統合されていることの利点の 1 つは、init デーモンの他の隣接プログラムを利用できることです。たとえば、Systemd-run でタイマーを使用して、マシン上に 1 回限りの一時的なジョブを作成できます。

単純な一時タイマーを作成するには、ターミナル セッションに次のコード行を貼り付け、--on-calendar変数の値をコマンドを実行する間隔に置き換えます。

実行するコマンドを行末に追加し、押してEnterスケジュールします。

--on-boot変数と変数の両方を使用して一時的な単調タイマーを作成することもできます--on-unit-active

次のコマンドを実行して、一時タイマーが Systemd のジョブ スケジューラのキューに登録されていることを確認します。

システムにロードされた一時タイマーのステータスを表示する端末。

Systemd タイマーの実行

新しい Systemd タイマーを実行するには、現在の Systemd セッションに正しくロードされていることを確認する必要があります。そのためには、カスタム サービスとタイマー ファイルの両方を Systemd のサービス ディレクトリにコピーします。

init デーモンの現在の設定を再読み込みします。

次のようにして、作成したサービスとタイマーの両方をアクティブ化しますsystemctl

新しいターミナル セッションで次のコマンドを実行して、新しいタイマーが適切にロードされたかどうかを確認しますsudo systemctl status my-new-timer.timer。この場合、タイマーがスケジュールされ、システムの実行準備が整っていることがわかります。

現在のシステムで実行されているタイマー ファイルを表示する端末。

Systemd タイマーを使用してタスクをスケジュールする方法を学ぶことは、Linux マシンが内部でどのように動作するかを理解するためのほんの一部にすぎません。Grub と Systemd-boot の比較記事を読んで、この素晴らしい OS の内部を詳しく調べてください。

画像クレジット: Alexandr Podvalny (Unsplash 経由)。すべての変更とスクリーンショットは Ramces Red によるものです。

コメントを残す

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