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


16

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

내 안에 다음이 있다고 가정합니다 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은 작업 실행 시간에 신경 쓰지 않습니다. 추가 사본이 실행됩니다.
Jeff Schaller

질문 형식이 올바른지 확인하십시오.
Bram

답변:


31

각 크론 작업은 지정한 다른 작업과 독립적으로 실행됩니다. 이는 오래 지속 된 스크립트가 지정된 시간에 다른 작업이 실행되는 것을 방해하지 않음을 의미합니다.

스크립트가 예약 된 다음 cron 간격 으로 계속 실행중인 경우 스크립트의 다른 동시 인스턴스가 실행됩니다.

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

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


8

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

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

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


6

다른 답변, 특히 @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 명령 자체와 일치하지 않도록하기 위해 사용됩니다.


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.