한 작업에 오랜 시간이 걸리는 여러 크론 작업 실행 11 */2 *

크론 작업에 관한 다음과 같은 일반적인 질문이 있습니다.

내 안에 다음이 있다고 가정합니다 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 간격 으로 계속 실행중인 경우 스크립트의 다른 동시 인스턴스가 실행됩니다.

스크립트의 기능에 따라 예기치 않은 결과가 발생할 수 있습니다. 나는에 Wikipedia 기사 읽기 추천 파일 잠금 에 특별히 섹션 잠금 파일을 . 잠금 파일은 리소스 (귀하의 경우 someScript3.sh스크립트)가 현재 ‘잠금’되어 있고 (즉, 사용 중) 잠금 파일이 제거 될 때까지 다시 실행되지 않아야한다는 신호를 보내는 간단한 메커니즘 입니다.

스크립트에서 잠금 파일을 구현하는 방법에 대한 자세한 내용은 다음 질문에 대한 답변을 참조하십시오.


답변

적절한 시간이 무슨 뜻인지 잘 모르겠습니다. Cron은 예정된 시간에 작업을 시작합니다. 다른 예약 된 작업이나 다른 작업 인스턴스는 확인하지 않습니다.

따라서 정의한 유효한 작업이 정의 된 시간에 시작됩니다. 정의 된 간격보다 오래 실행되는 작업은 여러 번 시작됩니다. 필요한 경우 실제로 여러 번 실행되지 않도록 작업을 작성한 사람은 누구나 책임을집니다. 예를 들어 잠금 파일 또는 PID 파일 등을 확인합니다.

병렬로 실행할 수있는 프로세스의 양에는 명백한 제한이 있지만 크론에 한정되지는 않습니다.


답변

다른 답변, 특히 @soulcake가 게시 한 링크 : 너무 짧은 간격으로 장시간 실행되는 명령을 예약하면 첫 번째 명령이 완료되기 전에 두 번째 명령이 행복하게 실행됩니다 (명령에 어떤 종류의 뮤텍스가 구현되어 있지 않은 한) .

이로 인해 원래 명령이 더 느려져 이전 인스턴스가 완료되기 전에 다른 인스턴스가 실행되는 경우가 있습니다. 또는 다른 이유로 바람직하지 않을 수 있습니다.

방지하는 일반적인 방법은 이전 명령이 실행되고 있지 않도록 가드를 사용하여 명령을 실행하는 것입니다. 예를 들면 다음과 같습니다.

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

pgrep이 실행될 때 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 명령 자체와 일치하지 않도록하기 위해 사용됩니다.


답변

사용 flock합니다.

* * * * * exec flock --nonblock .ws_client.lock -c ws_client.py >& /tmp/ws_client.out


답변