at を使った一度きりのスケジューリング

LinuxBeginner
オンラインで実践に進む

はじめに

cron は定期的なジョブ(毎日、毎時など)に適しています。一方で、将来の特定の時刻にタスクを一度だけ実行したい場合もあります。たとえば、今夜 2:00 にサービスを再起動したり、30 分後にデータベースのスナップショットを取得したりする場合です。

このような一度きりのタスクには、Linux の at ユーティリティを使用できます。

at コマンドは、標準入力またはファイルからコマンドを読み取り、指定した時刻に実行します。タスクを遅延実行したいものの、繰り返し実行する必要はない場合に便利です。これは、繰り返しのスケジュールを定義する cron とは異なります。

基本的な違いは次のとおりです。cron は繰り返し実行するスケジュールを定義し、at は将来一度だけ実行するジョブをキューに登録します。どちらも自動化ツールですが、解決する時間に関する問題が異なります。

この実験では、次の操作を行います。

  1. 前提条件のインストール: at ユーティリティをインストールし、デーモンが実行されていることを確認します。
  2. ジョブのスケジュール: at を使って、将来実行するコマンドをキューに登録します。
  3. キューの確認: atq を使って、保留中のジョブを一覧表示します。
  4. ジョブの管理: atrm を使って、キューからジョブを削除します。

at ユーティリティをインストールする

at コマンドは、すべての Linux ディストリビューションでデフォルトインストールされているとは限りません。まず、at がインストールされていることと、バックグラウンドサービスが実行されていることを確認します。

cron と同様に、at はデーモンに依存します。入力したコマンドによってキューに登録するジョブの定義が作成され、バックグラウンドサービスが後でそのジョブを実行します。

  1. パッケージをインストールします。
sudo apt-get install -y at
  1. at システムは、スケジュールされたコマンドを実行するために atd というバックグラウンドデーモンを使用します。サービスを起動します。
sudo service atd start
  1. サービスがアクティブであることを確認します。
sudo service atd status

atd が実行中であることを示す出力が表示されます。

ジョブをスケジュールする

システムの準備ができたので、5 分後にファイルを作成する簡単なタスクをスケジュールして、at が動作することを確認します。

まず、at コマンドの後に実行時刻を指定して実行します。

at now + 5 minutes

プロンプトが at> に変わります。これは入力待ちの状態を示しています。実行するコマンドを入力します。

このインターフェースは cron とは異なります。at では、将来実行するジョブのコマンドテキストを対話的に入力するためです。これは、一度だけ実行するタスクの本体を作成し、それをキューに登録する操作です。

echo "Hello LabEx" > /home/labex/project/hello.txt

保存して終了する方法:

  • Ctrl + D を押します。

<EOT>(End of Transmission)と、job 1 at ... のような確認メッセージが表示されます。

これで、ジョブがキューに登録されたことを確認できます。

保留中のジョブを一覧表示する(atq)

ジョブをスケジュールした後、そのジョブがキューに登録されていることや Job ID を確認したい場合があります。

キューを一覧表示するには atq コマンドを使用します。

atq

出力は通常、次のような形式になります。1 Mon Oct 23 10:05:00 2023 a labex

各項目の意味:

  • 1: Job ID です。ジョブを削除するときにこの番号を使用します。
  • Date/Time: ジョブが実行される予定の日時です。
  • User: ジョブを所有しているユーザーです。

スケジュールした作業は、登録した後に忘れてしまうことがあります。そのため、実行される前に保留中のタスクを確認できる atq は重要です。

キューが空の場合、ジョブがすでに実行されたか、登録に失敗した可能性があります。

ジョブをキャンセルする(atrm)

予定を変更した場合や、入力を間違えたことに気付いた場合は、ジョブが実行される前にキューから削除できます。

atrm コマンドの後に Job ID を指定して実行します。

まず、atq を使って Job ID を確認します。前のステップでは、おそらく 1 になっています。その後、次のコマンドを実行します。

atrm 1

次に、キューが空になったことを確認します。

atq

出力が何も表示されなければ、ジョブがキャンセルされたことを確認できます。ファイルは作成されません。

このキャンセル操作によって、キューに登録されたジョブが、単に実行を任せるだけのコマンドではなく、管理可能なオブジェクトであることが分かります。ジョブを確認し、ID で特定し、予定が変わった場合は実行前に削除できます。

まとめ

この実験では、一度だけ実行するタスクを管理する方法を学びました。

  1. インストール: at と atd をセットアップしました。
  2. スケジュール(at): at now + 5 minutes のような構文を使って、将来実行するコマンドをキューに登録しました。
  3. 一覧表示(atq): キューを確認し、保留中の Job ID と実行時刻を確認しました。
  4. 削除(atrm): ID を指定して、キューから特定のジョブを削除しました。

繰り返し実行するスケジュールには cron を使用し、一度だけ遅延実行する場合には at を使用します。