Cron 작업은 PHP 스크립트가 실행 중인지 확인하고 그렇지 않으면 실행됩니다.

Cron 작업은 PHP 스크립트가 실행 중인지 확인하고 그렇지 않으면 실행됩니다.

누군가가 나에게 올바른 방향을 알려줄 수 있는지 궁금합니다. 저는 Linux 명령줄을 사용한 경험이 거의 없습니다. 최근 직장에서의 다양한 요인으로 인해 몇 가지 지식을 배워야 합니다.

기본적으로 php내 서버의 디렉토리에 두 개의 스크립트가 있습니다. 애플리케이션 목적을 위해 이러한 스크립트는 지속적으로 실행되어야 합니다. 현재 이것이 내가 구현하는 방법입니다.

nohup sh -c 'while true; do php get_tweets.php; done' >/dev/null &

그리고

nohup sh -c 'while true; do php parse_tweets.php; done' >/dev/null &

그러나 무한 루프에도 불구하고 스크립트가 주기적으로 중지되어 강제로 다시 시작해야 한다는 사실을 발견했습니다. 이유는 모르겠지만 그렇습니다. 이로 인해 CRON실행 중인지 확인하고 그렇지 않으면 실행/다시 시작하는 작업의 전망에 대해 생각하게 되었습니다 .

누군가 나에게 이 작업을 수행하는 방법에 대한 정보를 줄 수 있습니까?

답변1

크론 작업 개념을 처음 접하셨기 때문에 Davidann의 답변을 확장하고 싶습니다. 모든 UNIX 또는 Linux 시스템에는 어딘가에 crontab이 저장되어 있습니다. crontab은 일반 텍스트 파일입니다. 다음을 고려하십시오.젠투 위키의 크론)

#Mins  Hours  Days   Months  Day of the week
10     3      1      1       *       /bin/echo "I don't really like cron"
30     16     *      1,2     *       /bin/echo "I like cron a little"
*      *      *      1-12/2  *       /bin/echo "I really like cron"

이 crontab은 격월로 매일, 매시간, 매분마다 "I really like cron"을 에코해야 합니다. 분명히, cron을 정말 좋아하는 경우에만 이 작업을 수행할 것입니다. crontab은 또한 1월과 2월 매일 16시 30분에 "I kind of cron"을 에코합니다. 1월 1일 3시 10분에는 "저는 크론을 별로 좋아하지 않습니다"라는 응답도 받았습니다.

cron 초보자로서 별표 표시된 열을 주석 처리하여 각 열의 기능을 알 수 있습니다. 내가 아는 모든 Cron 구현은 이 순서대로 되어 있습니다. 이제 Davidann의 답변을 내가 주석 처리한 파일과 병합합니다.

#Mins  Hours  Days   Months  Day of week
  *     *      *      *       *   lockfile -r 0 /tmp/the.lock && php parse_tweets.php; rm -f /tmp/the.lock
 

각 열에 아무 값도 입력하지 않으면 기본값은
매시, 매시, 매월, --> 1년 내내 매분입니다.

Davidann이 말했듯이 잠금 파일을 사용하면 파일을 "실행"하는 명령인 PHP 인터프리터의 복사본 하나만 실행되고 php parse_tweets.php줄의 마지막 비트는 다음 실행을 위해 준비된 잠금 파일을 제거합니다. 나는 매분마다 파일을 삭제하는 것을 좋아하지 않지만 그것이 필요한 동작이라면 이것은 매우 수용 가능합니다. 디스크에 쓰고 다시 쓰는 것은 개인 취향일 뿐입니다.

답변2

실행되지 않을 때 별도의 cron을 사용하여 시작하는 대신 cron을 사용하는 것은 어떨까요?

예를 들어:

* * * * * 'lockfile -r 0 /tmp/the.lock && (php parse_tweets.php; rm -f /tmp/the.lock)'

그러면 잠금 파일을 사용하여 1분마다 실행되는 cron 작업이 실행되므로 parse_tweets.php한 번에 하나의 cron 실행 복사본만 실행할 수 있습니다. ( php parse_tweets.php크론 외부에서 실행하는 것을 막지는 못합니다 )

답변3

정기점검은 편리하지도, 신뢰할 수도 없습니다. 스크립트가 중지되면 크론 작업이 다시 실행될 때까지 다시 시작되지 않습니다.

가지다프로세스가 항상 실행되도록 보장하는 도구, 예를 supervise들어데몬 도구,감시 장치,하나님,감독자기다리다. 부팅 시 모니터링 도구를 시작하고 그대로 두십시오.

while true; do … done조잡하지만 효과적인 모니터링 도구이지만 몇 가지 예방 조치를 취해야 합니다. nohup시작이다. 터미널이 아니도록 표준 입력을 리디렉션해야 합니다(일부 구현에서는 nohup이를 수행할 수 있음). 출력을 파일에 기록하고 파일에 오류가 있는지 확인해야 합니다.

nohup sh -c 'while true; do …; done' </dev/null >myscript.log 2>&1 &

또한 쉘이 종료 시 작업에 신호를 보내지 않는지 확인하십시오. 쉘에 disown내장 명령이 있으면 이를 실행하십시오.

많은 시스템에서 항목을 등록하여 부팅 시 Supervisor가 시작되도록 예약할 수 있습니다 @reboot. 지원 crontab(5)되는지 확인하려면 시스템의 매뉴얼 페이지를 확인하세요 @reboot.

@reboot while true; do …; done </dev/null >myscript.log 2>&1

관련 정보