ウェブサイト検索

1分未満のインターバルジョブをCronベースのスケジューラーを使用して実行する方法


LinuxのCron時間ベーススケジューラを使用していると、1分未満の間隔でタスクを実行する必要が生じることがあります。しかし、Cronのネイティブ機能ではそのような細かなスケジュール設定はできません。デフォルトでは、Cronの最小間隔は1分です。タスクを数秒ごとに実行する必要がある特定のアプリケーションにとって、これは制限となる可能性があります。この記事では、この制限を克服し、1分未満の間隔でタスクを成功裏にスケジュールするための複数の方法を探ります。

このチュートリアルでは、あなたは学びます:

  • 1分未満の間隔でタスクを実行する方法
  • 各メソッドのステップバイステップの指示と例コード

1分未満のインターバルジョブを実行する方法

1分未満の間隔でジョブを実行するためのいくつかの方法があります。それぞれの方法には独自の利点があり、異なるユースケースに適しています。以下は、使用できる3つの方法です。

  1. バッシュスクリプトでのwhileループの使用: 一分未満の間隔でタスクを実行する最も簡単な方法の一つは、バッシュスクリプトでwhileループを使用することです。この方法では、コマンドを実行した後、指定された秒数だけスリープしながら継続して実行されるスクリプトを書くことが含まれます。

    #!/bin/bash
    while true; do
      # Your command here
      sleep 10
    done
    
  2. この方法では、while trueループがスクリプトを無限に実行することを保証します。sleep 10コマンドは、各反復間にスクリプトを10秒間一時停止させ、タスクが10秒ごとに実行されるようにします。この方法はシンプルですが、継続的に実行されるため、CPUリソースを多く消費します。

  3. systemdタイマーの使用:

    システムD タイマー精度
    システムDタイマーは、分未満の間隔でタスクをスケジューリングするのに便利ですが、正確なタイミングを提供するわけではありません。システムの負荷、実行時間、タイマーの粒度などの要因がわずかな遅延を引き起こす可能性があり、指定した間隔よりも少し長くなる場合があります。正確なタイミングが必要な重要なタスクに対しては、代替ソリューションを検討するか、間隔を適切に調整してください。

    [Unit]
    Description=Run My Task
    
    [Service]
    ExecStart=/path/to/your/script.sh
    

    2. タイマーファイルの作成:
    – 次に、対応するタイマーファイルを/etc/systemd/system/mytask.timerで作成します。このタイマーファイルはタスクがどのくらいの頻度で実行されるかを制御します。
    – OnBootSec=10ディレクティブは、システムがブートアップした後、タイマーが10秒後に開始されることを保証します。
    – OnUnitActiveSec=10ディレクティブは、サービスの最後の実行から10秒ごとにタスクが実行されるようにスケジュールします。この値を調整して、希望の間隔を設定します。
    – WantedBy=timers.targetフィールドは、システムがブートする際にタイマーが自動的に開始されることを保証します。

    [Unit]
    Description=Run My Task Every 10 Seconds
    
    [Timer]
    OnBootSec=10
    OnUnitActiveSec=10
    
    [Install]
    WantedBy=timers.target
    

    3. systemdをリロードし、タイマーを有効にする:
    – 2つのファイルが作成されたら、次のコマンドを実行して新しいサービスとタイマーを認識させるためにsystemdマネージャーの設定をリロードします:

    systemctl daemon-reload

    – その後、ブート時に自動的に開始するようにタイマーを有効にします:

    systemctl enable mytask.timer

    – 最後に、最初に手動でタイマーをスタートします(オプション):

    systemctl start mytask.timer

    4. タイマーの状態をチェックする:
    – タイマーが正しく動作しているか確認するには、次の方法でその状態を確認できます:

    systemctl status mytask.timer

    – このコマンドは、タイマーがアクティブかどうか、次にいつ実行される予定かを示します。

    5. タイマーログの確認:
    – journalctlコマンドを使用して、サービスとタイマーの両方のログを確認することもできます。

    journalctl -u mytask.service

    この文章はタスクの実行に関する詳細と、潜在的な問題について提供します。

    この設定では、サービスユニットが実行されるタスクを定義し、タイマーユニットが実行の頻度を制御します。タイマーユニットのOnUnitActiveSec=10ディレクティブは、タスクが10秒ごとに実行されることを保証します。この方法は、精密なスケジューリングのためのsystemdの組み込み機能を活用するため、whileループを使用するよりもリソース効率が良いです。

  4. systemdタイマーは、分未満の間隔でタスクをスケジュールするためのCronに対するより効率的で柔軟な代替手段です。systemdタイマーは、正確なタイミングと低いリソース消費を必要とするタスクに特に適しています。以下は、特定の間隔でタスクを実行するためのsystemdサービスとそれに対応するタイマーを作成するための詳細な手順です。1. サービスファイルを作成する:

  5. スリープを使用したCrontabハック: 1分未満の間隔でタスクを実行する別の方法は、スリープコマンドと組み合わせてCrontabエントリを利用することです。この方法では、同じ分内でタスクの実行をずらすことができます。

    * * * * * /bin/bash -c 'command1; sleep 15; command2; sleep 15; command3'
    
  6. この例では、Cronジョブは毎分実行されますが、sleepコマンドが使用されて、次のコマンドの実行を遅延させます。これにより、同じ分内でタスクをより小さな間隔に分割することができます。この方法は真のサブミニットスケジューリングを提供しませんが、正確なタイミングが重要でない特定のシナリオでは便利です。

結論

Cronのデフォルトの機能はタスクスケジューリングを1分間隔に制限していますが、より頻繁な実行を実現するためのいくつかの方法があります。whileループを使用する、systemdタイマーを使用する、またはCronとsleepの巧妙な組み合わせを使用するかに関わらず、各アプローチはこの制限を克服する方法を提供します。特定の要件に応じて、ニーズやシステムリソースに最も適した方法を選択できます。

関連記事: