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 コマンドを使用すると、バックグラウンドで実行できます。
使用している 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 タグにより、タイマーがすぐに実行されます。それ以外の場合、操作はシステムが再起動されるか、ユーザーがログインした後にのみトリガーされます。
[タイマー]このセクションの各フィールドの機能は次のとおりです:
SystemD タイマーと Crontab タイマーは同じではないことがわかります。タスクのスケジュール期間は、年、月、日、時、分の期間に従って設定されず、最初の期間に基づいています。 time 実行時に開始され、毎回 1 サイクルの時間が追加されます。 Crontab のような時間設定方法が気に入っている場合は、SystemD タイマーもそれをサポートしているため、次のように OnBootSec と OnUnitActiveSec を削除し、OnCalendar に置き換える必要があります。は例です:
OnCalendar=*-*-* *:*:00,10,20,30,40,50
最後に、デフォルトでは、SystemD タイマーとサービスは同じ名前に関連付けられます。必要に応じて、次のように指定して、[Timer] ペアで構成することもできます。 単位フィールド。
上記のメソッドはすべて、分未満の粒度でスケジュールされたスケジューリング タスクを実装できます。それぞれに利点があります。 SystemD タイマーはより形式的に見えますが、少し複雑です。 Crontab sleepこの方法は扱いにくいですが、いくつかの小さなタスクには使えないわけではありません。
以上がCrontab に毎秒タスクを実行させる方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。