Linux ジョブスケジューリング

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

はじめに

Linux のジョブスケジューリングの実験へようこそ。このセッションでは、Unix 系オペレーティングシステムにおける時間ベースのジョブスケジューラである crontab ユーティリティを使用して、Linux で繰り返しタスクを自動化する方法を学びます。

タスクのスケジューリングは、システム管理者や開発者にとって基本的なスキルです。日常の操作を自動化することで、効率を向上させ、信頼性を確保し、手動介入を減らすことができます。crontab ユーティリティを使用すると、分から月までの指定された間隔でコマンドを実行するようにスケジュールすることができます。

この実験を通じて、crontab を使用してスケジュールされたタスクを作成、管理、監視する方法を学びます。最後まで学習すると、独自の Linux 環境で自動タスクスケジューリングを実装するスキルを身につけることができます。

Crontab の理解と最初のスケジュールタスクの作成

Crontab (Cron テーブル) は、Linux で指定された時間に自動的にタスクを実行するようにスケジュールできるユーティリティです。これらのスケジュールされたタスクは「cron ジョブ」と呼ばれます。

Crontab の構文

cron ジョブの基本的な構文は次の形式に従います。

* * * * * command_to_execute

各アスタリスクは異なる時間単位を表します。

  1. 分 (0 - 59)
  2. 時 (0 - 23)
  3. 日 (1 - 31)
  4. 月 (1 - 12)
  5. 曜日 (0 - 6、0 は日曜日)

たとえば、毎日午後 2:30 にコマンドを実行するには、次のようにします。

30 14 * * * command_to_execute

最初の cron ジョブの作成

毎分現在の日付と時刻を記録する簡単な cron ジョブを作成しましょう。これにより、cron ジョブの動作原理を理解するのに役立ちます。

まず、適切なディレクトリにいることを確認します。

cd ~/project

次に、cron ジョブが日付と時刻を書き込む空のログファイルを作成しましょう。

touch ~/project/date_log.txt

次に、次のコマンドで crontab エディタを開きます。

crontab -e

crontab を初めて使用する場合は、エディタを選択するように促されることがあります。好みのオプションを選択してください (初心者には nano がおすすめです)。

エディタで、ファイルの末尾に次の行を追加します。

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

エディタを保存して終了します。

  • nano を使用している場合は、Ctrl+O を押して保存し、Enter を押して確認し、最後に Ctrl+X を押して終了します。
  • vim を使用している場合は、Esc を押し、:wq と入力して Enter を押します。

この cron ジョブは、毎分現在の日付と時刻を date_log.txt ファイルに追加します。少なくとも 1 分待ってから、cron ジョブが動作しているか確認します。

cat ~/project/date_log.txt

次のような出力が表示されるはずです。

Tue Feb 15 14:32:01 UTC 2023

もっと時間を置いてからコマンドを再度実行すると、約 1 分間隔のタイムスタンプ付きの複数のエントリが表示され、cron ジョブが正しく実行されていることが確認できます。

Cron ジョブの管理と変更

これで最初の cron ジョブを作成しました。次に、スケジュールされたタスクを表示、変更、管理する方法を学びましょう。

現在の Cron ジョブの表示

現在の cron ジョブを表示するには、次のコマンドを使用します。

crontab -l

このコマンドは、現在あなたのユーザーにスケジュールされているすべての cron ジョブを表示します。前のステップで作成したジョブが表示されるはずです。

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

Cron ジョブのスケジューリングパターンの理解

ジョブを変更する前に、いくつかの一般的なスケジューリングパターンを理解しましょう。

  • * * * * * - 毎分実行
  • */5 * * * * - 5 分ごとに実行
  • 0 * * * * - 毎時 0 分に実行
  • 0 0 * * * - 毎日深夜 0 時に実行
  • 0 0 * * 0 - 毎週日曜日の深夜 0 時に実行

Cron ジョブの変更

既存の cron ジョブを、毎分実行から 5 分ごとに実行するように変更しましょう。これを行うには、crontab エディタを開きます。

crontab -e

前のステップで追加した行を見つけます。

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

次のように変更します。

*/5 * * * * date >> ~/project/date_log.txt

最初の位置の */5 は「5 分ごと」を意味します。前と同じ方法でエディタを保存して終了します (nano の場合は Ctrl+OEnterCtrl+X)。

変更を確認するには、再度 crontab を表示します。

crontab -l

更新された cron ジョブが表示されるはずです。出力は次のようになります。

*/5 * * * * date >> ~/project/date_log.txt

5 分待ってから再度ログファイルを確認すると、

cat ~/project/date_log.txt

新しいエントリが毎分ではなく 5 分ごとに追加されていることに気づくはずです。

ジョブ実行頻度を変更する利点

適切な間隔でジョブを実行することで、システムリソースを最適化するのに役立ちます。非常に頻繁に実行されるジョブ (毎分など) は不要なシステム負荷を引き起こす可能性がありますが、あまり頻繁でないスケジュール (5 分ごとなど) は、監視タスクにおいてタイムリネスと効率のバランスをとるのに適しています。

より高度な Cron ジョブの作成

基本的なことが理解できたので、システム情報をログに記録するより高度な cron ジョブを作成しましょう。

システム情報ログ記録ジョブの作成

システムのメモリ使用量に関する情報を毎時ログに記録する cron ジョブを作成しましょう。この種の監視は、システムのパフォーマンスを経時的に追跡するのに役立ちます。

まず、メモリ情報を収集するシェルスクリプトを作成しましょう。

nano ~/project/memory_check.sh

nano エディタで、次の内容を追加します。

#!/bin/bash
echo "Memory check at $(date)" >> ~/project/memory_log.txt
free -m >> ~/project/memory_log.txt
echo "--------------------" >> ~/project/memory_log.txt

このスクリプトは以下のことを行います。

  1. ログにタイムスタンプを追加する
  2. free -m コマンドを実行して、メモリ使用量をメガバイトで表示する
  3. 読みやすさのために区切り線を追加する

エディタを保存して終了します (Ctrl+OEnter、そして Ctrl+X を押します)。

次に、スクリプトを実行可能にします。

chmod +x ~/project/memory_check.sh

スクリプトが正しく動作することを確認するためにテストできます。

~/project/memory_check.sh

出力ファイルを確認します。

cat ~/project/memory_log.txt

タイムスタンプ、メモリ使用量情報、および区切り線が含まれた出力が表示されるはずです。

次に、このスクリプトを crontab を使用して毎時実行するようにスケジュールしましょう。

crontab -e

次の行を追加します (既存の cron ジョブはそのままにします)。

0 * * * * ~/project/memory_check.sh

これにより、メモリチェックスクリプトが毎時 0 分に実行されます。エディタを保存して終了します。

新しい cron ジョブが追加されたことを確認するには、

crontab -l

両方の cron ジョブが表示されるはずです。

*/5 * * * * date >> ~/project/date_log.txt
0 * * * * ~/project/memory_check.sh

特殊な時間文字列の使用

Cron は、一般的なスケジューリングパターンに対応するいくつかの特殊な時間文字列もサポートしています。

  • @hourly - 0 * * * * と同じ
  • @daily - 0 0 * * * と同じ
  • @weekly - 0 0 * * 0 と同じ
  • @monthly - 0 0 1 * * と同じ
  • @reboot - システム起動時に実行

これらの特殊な文字列を使用して、毎日実行されるジョブを追加しましょう。

crontab -e

次の行を追加します。

@daily echo "Daily check on $(date)" >> ~/project/daily_check.txt

エディタを保存して終了します。これにより、毎日深夜 0 時に daily_check.txt ファイルに新しいエントリが作成されます。

新しい cron ジョブが追加されたことを確認するには、

crontab -l

これで 3 つの cron ジョブがすべて表示されるはずです。

*/5 * * * * date >> ~/project/date_log.txt
0 * * * * ~/project/memory_check.sh
@daily echo "Daily check on $(date)" >> ~/project/daily_check.txt

Cron ジョブの出力の管理

デフォルトでは、cron はジョブからの出力をユーザーのメールに送信します。出力を完全に破棄したい場合は、/dev/null にリダイレクトすることができます。

*/10 * * * * ~/project/some_script.sh > /dev/null 2>&1

これは、保存する必要のない出力を生成するスクリプトに一般的な手法です。

まとめ

Linux ジョブスケジューリングの実験を完了したことをお祝いします。これで、Linux で crontab ユーティリティを使用してタスクを自動化する方法を学びました。

この実験を通じて、以下のことを達成しました。

  • 定期的に日付と時刻をログに記録する基本的な cron ジョブを作成しました。
  • crontab の構文と時間フィールド(分、時、日、月、曜日)の意味を学びました。
  • 既存の cron ジョブを変更して、実行頻度を変更しました。
  • システム監視用のシェルスクリプトを作成し、毎時実行するようにスケジュールしました。
  • @daily のような特殊な時間文字列を使用して、一般的なスケジューリングパターンを設定しました。
  • cron ジョブの出力を管理する方法を学びました。

これらのスキルは、すべての Linux ユーザーやシステム管理者にとって不可欠です。crontab を使用すると、以下のような日常的なタスクを自動化できます。

  • システムのメンテナンスとクリーンアップ
  • データのバックアップと同期
  • ログのローテーションと管理
  • 定期的なヘルスチェックと監視
  • スケジュールされたレポート作成

効果的なジョブスケジューリングを実装することで、システムの信頼性を向上させ、手動介入を減らし、ワークフローを最適化できます。常に cron ジョブを十分にテストし、スケジュールされたタスクがシステムパフォーマンスに与える影響を考慮するようにしてください。

crontab や他の Linux スケジューリングツールの機能を引き続き探索し、自動化スキルをさらに向上させましょう。