クローンの操作については、次の一般的な質問があります。
私のファイルに次のものがあるとしましょう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によって再度呼び出されるとどうなりますか?
答え1
各クローンジョブは、指定した他のジョブとは独立して実行されます。これは、長寿命のスクリプトが、指定された時間に他のジョブが実行されるのを妨げないことを意味します。
あなたのスクリプトの一つでもまだ次のスケジュールされたクローン間隔で、スクリプトの別の同時インスタンスが実行されます。
スクリプトの機能によっては、予期しない結果が生じる可能性があります。 Wikipediaの記事を読んでください。ファイルロック、特に関連してファイルロック。ロックファイルは、リソース(someScript3.sh
あなたの場合はスクリプト)が現在「ロック」(つまり使用中)になっており、ロックファイルが削除されるまで再実行してはならないことを示す簡単なメカニズムです。
スクリプトでファイルロックを実装する方法の詳細については、次の質問に対する回答をご覧ください。
答え2
適切な時間が何を意味するのか分かりません。 Cronはスケジュールされた時間に作業を開始します。スケジュールされた他のジョブやジョブの他のインスタンスは確認されません。
したがって、定義したすべての有効なジョブは定義された時間に開始されます。定義された間隔より長く実行されるジョブは複数回開始されます。必要に応じて、ジョブが実際に何度も実行されるのを防ぐことは、ジョブを作成した人の責任です。たとえば、ロックファイルやPIDファイルなどを確認します。
並列に実行できるプロセスの数には明確な制限がありますが、これらの制限はcronに限定されません。
答え3
他の回答、特に@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コマンド自体と一致するのを防ぐために使用されます。
答え4
私は使用しますflock
。
* * * * * exec flock --nonblock .ws_client.lock -c ws_client.py >& /tmp/ws_client.out