ホームページ  >  記事  >  運用・保守  >  Crontab に毎秒タスクを実行させる方法

Crontab に毎秒タスクを実行させる方法

coldplay.xixi
coldplay.xixiオリジナル
2020-07-06 16:29:017328ブラウズ

Crontab に毎秒タスクを実行させる方法

Crontab に毎秒タスクを実行させる方法

Crontab は、Linux でのスケジュール設定ファイルで、システム プログラム、スクリプト、コマンド、タスクを設定した時間に実行できます。 . 、インターバルおよびサイクル動作。 Crontab の最小時間粒度は分です。つまり、Crontab の設定では、対象タスクを最大 1 分に 1 回実行できますが、それ以上の頻度で実行することはできず、他の方法を使用するしかありません。

関連する学習の推奨事項: linux ビデオ チュートリアル

たとえば、プログラムを 30 秒ごとに実行したい場合はどうすればよいでしょうか。

これを回避する方法はまだあります。 1 つのアイデアは、Crontab に 2 つの構成を追加することです。1 つは通常のスケジュール用で 1 分ごとに実行され、もう 1 つは実行前に 30 秒待機するというものです。

# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * *              /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )

この方法は少し堅くて奇妙に感じますが、うまくいきます。この方法は、実際には 1 行に短縮できます:

* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"

もう 1 つの方法は、watch コマンドを使用することです:

$ watch --interval .30 script_to_run_every_30_sec.sh

ただし、watch はコマンド ライン ツールなので、次のように使用できます。 nohup コマンドを使用すると、バックグラウンドで実行できます。

SystemD タイマー

使用している Linux システムに SystemD がある場合は、SystemD タイマーを使用して、いつでもプログラムをスケジュールできます。もちろん、理論的にはナノ秒レベルの粒度でプログラムをスケジュールできます。 、それをするのはちょっとおかしいです。つまり、タスク スケジューリングの柔軟性は Cron よりもはるかに高く、sleep のようなつまらないソリューションを使用する必要はありません。

1 行で構成を完了する crontab と比較すると、SystemD タイマーの確立は若干複雑ですが、「1 分あたり」よりも小さい粒度でタスクのスケジュールをより適切に実装するには、この方法を試してみる価値があります。

SystemD タイマーの実装原理は、システム サービスと SystemD タイマーの 2 つの部分だけです。 SystemD タイマーがスケジューリングを実行し、タスクはサービス内に書き込まれます。

これは簡単な例です。目標は、システム ロガーに 10 秒ごとに「Hello World」を出力させることです;

/etc/systemd/system/helloworld.service

[Unit]
Description=Say Hello
[Service]
ExecStart=/usr/bin/logger -i Hello World

/etc/systemd/system/helloworld.timer

[Unit]
Description=Say Hello every 10 seconds
[Timer]
OnBootSec=10
OnUnitActiveSec=10
AccuracySec=1ms
[Install]
WantedBy=timers.targethelloworld.timer里并没有声明service的名称,那它和service是如何关联的呢?没错,因为它们的名称相同,都是helloworld。

システム全体でこのタイマーを使用する場合は、これら 2 つのファイルを次の場所に配置する必要があります。 /etc/systemd/system。特定のユーザーに使用したい場合は、~/.config/systemd/user に配置します。このタイマーをすぐに実行したい場合は、次のコマンドを実行する必要があります。

systemctl enable --now helloworld.timer

–now タグにより、タイマーがすぐに実行されます。それ以外の場合、操作はシステムが再起動されるか、ユーザーがログインした後にのみトリガーされます。

[タイマー]このセクションの各フィールドの機能は次のとおりです:

  • OnBootSec – システムの起動から何秒後かスケジューリングの開始
  • OnUnitActiveSec – 関連サービスを繰り返しスケジュールする時間間隔。 cron ジョブなどのスケジュールされたアクションを決定するのは、この構成行です。
  • AccuracySec – タイマーの精度。デフォルトは 1 分で、cron と非常によく似ています。より高い値が必要になる場合もありますが、精度が向上するとシステム消費量が増加し、CPU がより頻繁にウェイクアップされます。上記の設定では 1ms となっていますが、これは明らかに賢明な決定ではありません。通常、これを 1 (1 秒) に設定できます。これは、1 分未満の時間粒度のタイマー精度要件には十分です。このため、実際のプログラムを実行すると、「Hello World」メッセージの出力が 1 秒程度遅れることがよくあります。この 1 秒程度の遅延が問題ないと思われる場合は、このように設定するとよいでしょう。

SystemD タイマーと Crontab タイマーは同じではないことがわかります。タスクのスケジュール期間は、年、月、日、時、分の期間に従って設定されず、最初の期間に基づいています。 time 実行時に開始され、毎回 1 サイクルの時間が追加されます。 Crontab のような時間設定方法が気に入っている場合は、SystemD タイマーもそれをサポートしているため、次のように OnBootSecOnUnitActiveSec を削除し、OnCalendar に置き換える必要があります。は例です:

OnCalendar=*-*-* *:*:00,10,20,30,40,50

最後に、デフォルトでは、SystemD タイマーとサービスは同じ名前に関連付けられます。必要に応じて、次のように指定して、[Timer] ペアで構成することもできます。 単位フィールド。

上記のメソッドはすべて、分未満の粒度でスケジュールされたスケジューリング タスクを実装できます。それぞれに利点があります。 SystemD タイマーはより形式的に見えますが、少し複雑です。 Crontab sleepこの方法は扱いにくいですが、いくつかの小さなタスクには使えないわけではありません。

以上がCrontab に毎秒タスクを実行させる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。