Linux における at と cron を使用したタスクスケジューリング

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

はじめに

この実験では、Linux 環境におけるタスクスケジューリングの基礎を学びます。将来の特定の時間に 1 回だけジョブを実行するための at と、日次、週次、月次などの定期的なスケジュールで実行する必要があるタスクを自動化するための cron という、2 つの不可欠なコマンドラインユーティリティについて学習します。

まず、実験環境を準備し、at および cron サービスがインストールされ、アクティブであることを確認することから始めます。次に、at コマンドを使用して 1 回限りのジョブを作成し、atq および atrm でジョブキューを管理する練習をします。最後に、crontab コマンドを使用して定期的な cron ジョブを作成、確認、削除し、システム管理タスクの自動化に関する実務的なスキルを習得します。

実験環境の準備

このステップでは、Linux でタスクをスケジュールするために必要なツールをインストールして、実験環境を準備します。主に使用するツールは、単発タスク用の at と定期タスク用の cron の 2 つです。通常、cron はほとんどの Linux システムにプリインストールされていますが、at ユーティリティは手動でインストールが必要な場合があります。

まず、パッケージリストを更新して、最新バージョンのソフトウェアを取得できるようにします。

sudo apt-get update

リポジトリからパッケージリストがダウンロードされる様子が出力されます。

次に、apt-get コマンドを使用して at パッケージをインストールします。-y フラグを使用すると、インストールの確認が自動的に行われるため、プロンプトは表示されません。

sudo apt-get install -y at

インストールの進行状況が表示されます。完了すると、システムで at コマンドが使用可能になります。

at コマンドは、スケジュールされたジョブを実行するために atd と呼ばれるバックグラウンドサービス(デーモン)に依存しています。このサービスが実行されていることを確認する必要があります。systemctl コマンドでステータスを確認できます。

sudo systemctl status atd

出力結果に、サービスが active (running) であることが示されているはずです。

● atd.service - Deferred execution scheduler
     Loaded: loaded (/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
     Active: active (running) since <date_time>; <time_ago>
       Docs: man:atd(8)
   Main PID: <pid> (atd)
      Tasks: 1 (limit: 4622)
     Memory: 248.0K
        CPU: 11ms
     CGroup: /system.slice/atd.service
             └─<pid> /usr/sbin/atd -f

サービスがアクティブでない場合は、次のコマンドで起動できます。

sudo systemctl start atd

最後に、後のステップで使用する cron サービスもアクティブであることを確認しておきましょう。

sudo systemctl status cron

出力に active (running) と表示されれば、cron デーモンがスケジュールされたタスクを処理する準備ができていることが確認できます。

● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
     Active: active (running) since <date_time>; <time_ago>
       Docs: man:cron(8)
   Main PID: <pid> (cron)
      Tasks: 1 (limit: 4622)
     Memory: 1.1M
        CPU: 40ms
     CGroup: /system.slice/cron.service
             └─<pid> /usr/sbin/cron -f

atdcron の両方のサービスが実行されていることで、プロセスのスケジューリングを行うための環境が完全に整いました。

at コマンドによる単発ジョブのスケジュール

このステップでは、at コマンドを使用して、将来の特定の時間に一度だけ実行されるタスクをスケジュールする方法を学びます。これは、すぐに実行する必要はないものの、定期的に繰り返す必要もないスクリプトやコマンドを実行する場合に便利です。at コマンドは標準入力から一連のコマンドを読み取り、それらを指定された時間に実行される単一の「at ジョブ」としてまとめます。

現在のプロジェクトディレクトリ(~/project)に at_output.txt という名前のファイルを作成する簡単なコマンドをスケジュールしてみましょう。今から 1 分後に実行されるように設定します。

まず、希望する時間を指定して at コマンドを呼び出します。

at now + 1 minute

Enter キーを押すと、ターミナルのプロンプトが at> に変わります。これは、at がスケジュールしたいコマンドの入力を待っている状態であることを示しています。ここで、ファイルを作成してテキストを書き込むコマンドを入力します。

echo "The at job executed successfully." > ~/project/at_output.txt

コマンドを入力したら Enter キーを押します。ジョブを確定して at> プロンプトを終了するには、Ctrl-DCtrl キーを押しながら D を押す)を押します。ジョブがスケジュールされたことを示す確認メッセージが、ジョブ番号と実行時間とともに表示されます。

warning: commands will be executed using /bin/sh
job 1 at Mon Jan 1 12:01:00 2024

ここで、スケジュールされたジョブが実行されるまで 1 分間待ちます。

1 分経過したら、at_output.txt ファイルが存在するかどうかを確認して、ジョブが実行されたことを検証できます。ls -l コマンドを使用してファイルのプロパティを確認します。

ls -l ~/project/at_output.txt

ジョブが正常に実行されていれば、出力にファイルが表示されます。

-rw-r--r-- 1 labex labex 35 Jan  1 12:01 /home/labex/project/at_output.txt

次に、cat コマンドを使用してファイルの内容を表示し、echo コマンドが期待通りに動作したか確認します。

cat ~/project/at_output.txt

ターミナルに以下の出力が表示されるはずです。

The at job executed successfully.

最後に、次のステップのためにプロジェクトディレクトリを整理するため、作成したファイルを削除します。

rm ~/project/at_output.txt

これで、at コマンドを使用した単発ジョブのスケジュール、確認、および後片付けが正常に完了しました。

atq と atrm による保留中のジョブの管理

このステップでは、スケジュールされた at ジョブを表示およびキャンセルする方法を学びます。タスクをスケジュールした後に、それが不要になったり、変更が必要になったりすることはよくあります。atq コマンドを使用すると保留中のジョブのキューを表示でき、atrm コマンドを使用するとそれらを削除できます。

まず、管理する時間を確保するために、十分先の時間にジョブをスケジュールしましょう。10 分後に実行されるコマンドをスケジュールします。

at now + 10 minutes

at> プロンプトで、ファイルを作成するコマンドを入力します。ファイル名は temporary_job.txt とします。

touch ~/project/temporary_job.txt

Enter キーを押し、次に Ctrl-D を押してジョブを保存します。システムはジョブの作成を確認し、ジョブ番号を表示します。このジョブ番号をメモしておいてください。ジョブを削除する際に必要になります。

warning: commands will be executed using /bin/sh
job 2 at Mon Jan 1 12:10:00 2024

(注:実際のジョブ番号と時間は環境によって異なります。)

次に、保留中のすべてのジョブのリストを表示するには、atq (at queue) コマンドを使用します。

atq

出力には、スケジュールされたジョブの番号、実行予定日時、所属するキュー(a)、およびスケジュールしたユーザーが表示されます。

2 Mon Jan 1 12:10:00 2024 a labex

このジョブを実行したくないと判断した場合は、atrm (at remove) コマンドの後に先ほどメモしたジョブ番号を指定してキャンセルできます。

以下のコマンドの <job_number> を実際のジョブ番号に置き換えてください。例えば、ジョブ番号が 2 であれば、atrm 2 を実行します。

atrm <job_number>

ジョブの削除に成功した場合、このコマンドは何も出力しません。

ジョブがキューから削除されたことを確認するために、再度 atq を実行します。

atq

今回は何も出力されないはずです。これにより、at ジョブキューが空であり、temporary_job.txt ファイルが作成されないことが確認できました。

crontab -e による定期的なジョブの作成

このステップでは、cron を使用して定期的なタスクをスケジュールする方法を学びます。一度だけ実行される at とは異なり、cron はスケジュールに従って繰り返しジョブを実行するように設計されています。スケジュールされたジョブは、crontab と呼ばれる特別なファイルで管理します。

ユーザーの crontab ファイルを編集するには、crontab -e コマンドを使用します。-e は「edit(編集)」を意味します。

編集のために crontab ファイルを開きましょう。

crontab -e

crontab -e を初めて実行する場合、デフォルトのテキストエディタを選択するよう求められることがあります。使いやすい nano を選択することをお勧めします。

Select an editor. To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  ...

Choose 1-2 [1]:

1 を入力して Enter を押し、nano を選択します。crontab ファイルが開きます。使い方の説明がコメントとして記載されている以外は、ほとんど空の状態です。

crontab のエントリは、以下の 6 つのフィールドを持つ特定の形式になっています。 分 時 日 月 曜日 コマンド

時間フィールドにアスタリスク (*) を指定するとワイルドカードとして機能し、「すべて(毎)」を意味します。今回のタスクでは、毎分コマンドを実行するように設定します。これは、結果を確認するのに長く待つ必要がないため、テストに最適です。「毎分」のスケジュールは * * * * * となります。

ファイルの末尾に新しい行を追加して、現在のプロジェクトディレクトリにある cron_log.txt というログファイルに現在の日時を追記するジョブをスケジュールします。

* * * * * date >> ~/project/cron_log.txt

行を追加した後、エディタの内容は以下のようになっているはずです。

## Edit this file to introduce tasks to be run by cron.
#
## Each task to run has to be defined through a single line
## indicating with different fields when the task will be run
## and what command to run for the task
#
## To define the time you can provide concrete values for
## minute (m), hour (h), day of month (dom), month (mon),
## and day of week (dow) or use '*' in these fields (for 'any').
#
## Notice that tasks will be started based on the cron's system
## daemon's notion of time and timezones.
#
## Output of the crontab jobs (including errors) is sent through
## email to the user the crontab file belongs to (unless redirected).
#
## For example, you can run a backup of all your user accounts
## at 5 a.m. every week with:
## 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
## For more information see the manual pages of crontab(5) and cron(8)
#
## m h  dom mon dow   command
* * * * * date >> ~/project/cron_log.txt

ファイルを保存して nano を終了するには、Ctrl-X を押し、変更を確認するために Y を押し、最後に Enter を押してファイルに書き込みます。

終了すると、ターミナルに確認メッセージが表示されます。

crontab: installing new crontab

これは、新しい cron ジョブがアクティブになったことを意味します。cron デーモンは毎分このファイルをチェックし、コマンドを実行します。

少なくとも 1 分間待ちます。その後、ログファイルが作成されたことを確認します。

ls -l ~/project/cron_log.txt

リストにファイルが表示されるはずです。

-rw-r--r-- 1 labex labex 29 Jan  1 12:15 /home/labex/project/cron_log.txt

次に、その内容を表示します。

cat ~/project/cron_log.txt

コマンドが最初に実行された日時が表示されます。

Mon Jan  1 12:15:01 UTC 2024

もう 1 分待ってから再度 cat コマンドを実行すると、新しいタイムスタンプの行が追加されているのが確認でき、ジョブが繰り返し実行されていることがわかります。

crontab -l と -r による cron ジョブの確認と削除

この最後のステップでは、エディタを開かずにスケジュールされた cron ジョブを表示する方法と、それらを完全に削除する方法を学びます。これらは、システムのスケジュールされたタスクを整理し、クリーンに保つために不可欠な管理作業です。

まず、現在アクティブな cron ジョブをリスト表示してみましょう。crontab -l コマンド(-l は「list(一覧)」の略)を使用すると、crontab ファイルの内容をターミナルに直接表示できます。

crontab -l

出力には、前のステップで作成したジョブが表示されます。

## Edit this file to introduce tasks to be run by cron.
## ... (その他のコメント) ...
## m h  dom mon dow   command
* * * * * date >> ~/project/cron_log.txt

このコマンドは、どのようなジョブがスケジュールされているかを確認するための、安全な読み取り専用の方法です。

さて、この定期的なジョブが不要になったと仮定しましょう。これを削除するには、crontab -r コマンド(-r は「remove(削除)」の略)を使用します。このコマンドは、確認を求めずにユーザーの crontab ファイルをすべて削除するため、使用には十分注意してください。

crontab を削除するコマンドを実行します。

crontab -r

成功した場合、このコマンドは何も出力しません。

crontab が削除されたことを確認するために、再度リスト表示コマンドを実行します。

crontab -l

今回は、crontab ファイルが存在しないことを示すエラーメッセージが返されます。

no crontab for labex

これで、スケジュールされたジョブが正常に削除され、今後実行されないことが確認できました。

最後に、実験を完了してワークスペースを整理するために、cron ジョブによって作成された cron_log.txt ファイルを削除します。

rm ~/project/cron_log.txt

これで、cron ジョブの表示、削除、および削除の確認に成功し、管理のライフサイクル全体を完了しました。

まとめ

この実験では、at パッケージをインストールし、atd および cron サービスがアクティブであることを確認することで、タスクスケジューリングのための Linux 環境を準備する方法を学びました。at コマンドを使用して、将来実行される 1 回限りのジョブをスケジュールする練習を行いました。また、atq でキューを表示し、atrm で特定のジョブを削除することで、これらの保留中のジョブを管理する方法も学びました。

さらに、cron を使用して定期的なタスクをスケジュールする方法についても学習しました。crontab -e コマンドを使用してユーザーの crontab ファイルを編集し、新しい自動化ジョブを追加しました。最後に、crontab -l で現在スケジュールされている cron ジョブのリストを確認する方法と、crontab -r コマンドを使用してユーザーのスケジュールされた cron ジョブをすべて削除する方法を習得しました。