cronがスタンプされないようにする方法


13

15分ごとに実行する必要があるいくつかのcronスクリプトがあるとします。実行するように設定することもできます*/15 * * * *が、その後はすべて同時に実行されます。サーバーが数分間アイドル状態になった後、突然1ダースのスクリプトをすべて同時に実行しようとするのは馬鹿げているようです。

1、16、31、46分に1つのスクリプトを実行し、2、17、32、47分に別のスクリプトを実行する方法はありますか?

つまり、各スクリプトを15分ごとに実行したいのですが、15分ごとに実行することは気にしません。

回答:


7

これを必要以上に難しくしています。それらをすべてセミコロンで区切って同じ行に配置します。

*/15 * * * * command1 ; command 2 ; command 3

実行されcommand1、終了するのを待ってから、実行されcommand2、終了するのを待ちます。


15

cronジョブを次のように6-59/15 * * * *すると、1時間の6、21、36、および51分に実行されます。

これは、cronのすべてのバージョンで機能するとは限りません。


14

たとえば/etc/cron.15m、すべてのスクリプトをディレクトリに入れてから、cronを実行させることができます

*/15 * * * * run-parts /etc/cron.15m

これは、run-partsコマンドがあることを前提としています。少なくともすべてのDebianベースのシステムに存在します。指定されたディレクトリ内のすべての実行可能プログラムをリスト順に1つずつ実行します。

この方法の欠点は、スクリプトの1つがハングした場合、残りはすべて待機し、実行されないことです。それらすべての実行時間が15分を超える場合、ジョブは再び実行を開始し、多くのプロセスが積み重なる可能性があります。


run-partsFedora / Red Hatシステムにも存在します。
mattdm

9

これを行う最も簡単な方法は、必要なときに実行するコマンドを手動で設定することです。

0,15,30,45 * * * * command0
1,16,31,46 * * * * command1
2,17,32,47 * * * * command2
...
14,29,44,59 * * * * command14

または、適切なcrontabエントリを自動的に生成するスクリプトを記述できます(タイプミスを回避します)。

cronの一部のバージョン(おそらく使用しているものを含む)は、拡張構文を受け入れます。

0-59/15 * * * * command0
1-59/15 * * * * command1
1-59/15 * * * * command2
...
14-59/15 * * * * command14

0

クロンはあなたがやろうとしていることを本当に得意ではありません。基本的に15分間スリープし、コマンドを実行してからループするデーモンとして機能するスクリプトを記述することを検討しましたか?


1
それにはいくつかの潜在的な問題があります。1つはsleep 300、コマンドを実行するたびに実行すると、コマンド自体の実行により時間がドリフトすることです。15:00ごとではなく15:10ごとに実行される場合があります。また、バックグラウンドプロセスが停止した場合やシステムが再起動した場合、とは異なりcrond、自動的に再起動しません。バックグラウンドプロセスを「デーモン化」する方法はありますが、それではほとんど再実装されcrondます。
キーストンプソン

ええ、私はそれが完璧な解決策ではないことに同意します(ただし、&でタスクを常にバックグラウンドにすることができます)が、そこに行きます。
マットシモンズ

1
代わりに、cronにすべてのコマンドを順番に実行する単一のスクリプトを実行させるだけです。実際、run-partsほとんどのcronインストールに同梱される標準のスクリプトがあり、それを具体的に行うことが一般的に必要です。@AndrewSchulmanの回答を参照してください。
タイラー

0

多くのディストリビューションには/etc/cron.d/cronhourlyがあり、すべてのスクリプトは1時間ごとに実行されます。連続番号で開始することで順序を指定することもできます(lik 01scriptA 02scriptB)。SmoothwallのLinuxディストリビューションベースで「cronhourlybyfour」を呼び出す必要があるため、すでに必要なcronの知識は簡単です。

警告:これは、以前に提案されたrun-partsを使用し、run-partsは。名前にあるので、「deletehomefolders.sh」とは呼ばず、「01deletehomefolders」と呼んで、正しい#で始めるようにしてください。スクリプトを解釈する予定の行。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.