크론 작업에 관해 다음과 같은 일반적인 질문이 있습니다.
내 파일에 다음이 있다고 가정해 보겠습니다 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은 첫 번째 명령이 완료되기 전에 두 번째 명령을 행복하게 실행합니다. 뮤텍스).
이로 인해 원래 명령의 속도가 더욱 느려지는 경우가 많아 이전 명령이 완료되기 전에 다른 인스턴스가 실행되는 등의 현상이 발생합니다. 아니면 다른 이유로 바람직하지 않을 수도 있습니다.
일반적인 예방 방법은 이전 명령이 실행되지 않도록 보호 조건으로 명령을 실행하는 것입니다. 예를 들어:
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