1つのジョブに時間がかかる複数のcronジョブを実行する


16

cronジョブに関する次の一般的な質問があります。

私が次のものを持っていると仮定しますcrontab

* 10 * * * * someScript.sh
* 11 * * * * someScript2.sh
30 11 */2 * * someScript3.sh  <-- Takes a long time let's say 36 hours.
* 12 * * * someScript4.sh

適切なタイミングで残りのジョブを実行するのに十分賢いですか?たとえば、長いスクリプトを終了する必要はありませんか?

また、最初の長いスクリプトがまだ実行されていて、cronによって再度呼び出された場合はどうなりますか?

ありがとうございました!


Cronは、ジョブの実行時間を気にしません。追加のコピーを実行します。
ジェフシャラー

質問の形式が正しいことを確認してください。
ブラム

回答:


31

各cronジョブは、指定した他のジョブとは無関係に実行されます。これは、長期間有効なスクリプトが他のジョブが指定された時間に実行されるのを妨げないことを意味します。

スケジュールされた次のcron間隔でスクリプトのいずれかがまだ実行されている場合、スクリプトの別の同時インスタンスが実行されます。

これは、スクリプトの実行内容によっては予期しない結果になる可能性があります。ファイルのロックに関するウィキペディアの記事、特にロックファイルに関するセクションを読むことをお勧めします。ロックファイルは、リソースsomeScript3.sh(スクリプトの場合)が現在「ロック」されている(つまり使用中である)ことを通知する単純なメカニズムであり、ロックファイルが削除されるまで再度実行しないでください。

スクリプトにロックファイルを実装する方法の詳細については、次の質問への回答をご覧ください。


8

適切な時間までに何を意味するかわかりません。Cronは、スケジュールされた時刻にジョブを開始します。他のスケジュールされたジョブも、ジョブの他のインスタンスもチェックしません。

したがって、定義した有効なジョブはすべて、定義された時間に開始されます。定義された間隔よりも長く実行されるジョブは、複数回開始されます。ジョブが実際に複数回実行されるのを防ぐ必要がある場合は、ジョブを作成した人の責任です。たとえば、ロックファイルまたはPIDファイルなどをチェックします。

並行して実行できるプロセスの量には明らかな制限がありますが、それらはcron固有ではありません。


6

他の回答に加えて、特に@soulcakeが投稿したリンク:あまりにも短い間隔で長時間実行するコマンドをスケジュールすると、cronは最初のコマンドが完了する前に2番目のコマンドを喜んで実行します(コマンドに何らかのミューテックスが実装されていない限り) 。

これにより、元のコマンドの速度がさらに低下し、前のインスタンスが完了する前に別のインスタンスが実行されるなどの場合があります。または、他の理由で望ましくない場合もあります。

防止する一般的な方法は、前のコマンドが実行されていないことを保証するガードを使用してコマンドの実行を条件付けることです。例えば:

10 * * * * pgrep my_slow_command >/dev/null || /usr/local/bin/my_slow_command

実行時にpgrepがコマンドの名前と一致することを確認します。たとえば、pythonスクリプトは実行可能ファイルの名前としてpythonを持っています。これはおそらく十分に具体的ではなく、pythonのスクリプト名とも一致する必要があります。

10 * * * * pgrep -f my_script.py || /usr/local/bin/my_script.py

(ただし、 '-f'オプションなしのpgrepはbashスクリプト名と一致します)

何らかの理由でpgrepを使用できない場合:

10 * * * * ps ax | grep [m]y_command || /usr/local/bin/my_command

括弧は、grepコマンド自体と一致しないようにするために使用されます。


0

を使用しますflock

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