15분마다 일부 PHP 스크립트를 트리거하도록 웹 서버 cron 작업을 구성했지만 때로는 동일한 스크립트의 다른 프로세스가 시작될 때 스크립트 실행을 완료하는 데 15분 이상이 걸립니다. 이는 우리 논리에 문제를 야기합니다. 나는 단지 동일한 프로세스의 한 인스턴스를 실행하고 그것이 완료되면 다른 프로세스만 실행하도록 하려고 합니다(프로세스를 대기열에 넣지 않고 그 순간에 종료하고 다음 간격에 실행하기만 하면 됩니다).
예: 15분마다 웹 서버 크론 작업에 의해 호출되는 세 개의 PHP 파일이 있습니다. a.php, b.php, c.php를 가정합니다. 스크립트 실행을 완료하는 데 15분 이상 걸릴 수 있습니다. 실행이 끝나면 데이터베이스가 업데이트되므로 동일한 스크립트 파일의 두 복사본을 실행할 수 없습니다(이로 인해 논리가 중단됨). a.php가 오후 4시에 실행되고, cron이 오후 4시 15분에 a.php를 다시 실행한다고 가정해 보겠습니다. 여기서는 a.php 실행이 완료되었는지 확인하고 싶습니다. 그렇지 않은 경우 호출을 건너뛰지 않고 동일한 내용을 확인하여 오후 4시 30분에 실행합니다. 그러나 b.php, c.php 및 a.php는 병렬로 실행됩니다(그러나 동일한 인스턴스는 가능합니다). 티).
답변1
표준 관행은 pid 파일을 사용하는 것입니다. 스크립트가 실행될 때마다 파일을 확인하여 이미 어딘가에서 실행되었는지 확인하도록 합니다. 작업 순서는 아래에 설명되어 있습니다.
- PID 읽기
/var/run/yourscriptname.pid
- pid가 실행 중인지 확인하고, 그렇다면 종료합니다.
- 당신의 pid를 얻어서 쓰세요
/var/run/yourscriptname.pid
- 정상적인 실행
- pid 파일 삭제
귀하의 경우에는 이 작업을 수행할 수 있지만 어떤 경우에는 pid를 확인하고 pidfile을 쓰는 사이에 다른 프로세스가 시작되고 pidfile이 표시되지 않고 계속 실행될 정도로 스크립트가 충분히 빠르게 호출될 수 있습니다. 제안 잠금을 사용하면 상황을 더욱 강화할 수 있습니다. 거의 모든 Unix의 운영 체제에서 제공하는 기능입니다.
인용하다:
- 남자 그룹(2)
- Flock()을 사용하여 파일 잠금(PHP 언어)
답변2
이는 다음과 같이 매우 간단합니다 flock
.
* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/local/bin/frequent_cron_job
~에 귀속됨이 답변. Google을 통해 여기에 왔기 때문에 여기에도 공유해야겠다고 생각했습니다.
답변3
매번 새 작업을 시작할지, 아니면 아직 실행 중인 경우 순환을 건너뛸지 여부를 질문만으로는 파악하기 어렵습니다.
매번 다시 시작하고 싶다면 killall your_command; your_command
크론에서 다시 시작하는 것이 가장 쉬운 방법입니다.
그렇지 않으면 pgrep you_command || your_command
현재 실행 중인 것으로 확인되지 않는 경우에만 cron 라인에서 실행을 시도하십시오.
또한 좀 더 멋지게 작업의 PID를 일종의 실행 파일에 등록한 다음 작업을 시작하기 전에 해당 실행 파일에 활성 작업이 있는지 확인할 수도 있습니다. 하나를 찾으면 종료하고 실행하거나 다른 하나를 종료하고 자신의 PID를 현재 실행 중인 PID로 표시할 수 있습니다.