2011-02-15 5 views
0

PHP로 작성된 스크립트가 cron 작업에 의해 시작되었습니다. 이것은 장시간 실행되는 스크립트이며, 마지막 작업이 완료되기 전에 종종 다른 인스턴스를 시작합니다. 괜찮아. 나는이 스크립트의 3 인스턴스가 주어진 시간에 실행되도록 허용합니다.PHP/Cron 동시 실행 스크립트 수 제한

exec('ps -A | grep nameofmyscript', $results); 
if (count($results) > 4) { 
    echo "Already Running\n" 
    die(0); 
} 

그것은 작동하지만 더 나은 방법을 찾고 있어요 :

나는 스크립트의 상단에이 코드 3 개 인스턴스에 스크립트를 제한 할 수 있습니다. 이 접근법은 스크립트의 이름을 변경하고 코드 줄을 변경하는 것을 잊어 버렸을 때 몇 주 전에 되돌아 왔습니다. 또한 스크립트가 이미 실행중인 프로세스와 비슷한 이름으로 지정되면 실패합니다.

당신은 이름 배치를 자동화 할 수

답변

2

PHP를 사용하여, 당신은 cron 작업에 특정 디렉토리에서 임의로 명명 된 잠금 파일을 만들 수 있습니다. PHP 스크립트를 계속 진행하기 전에 디렉토리에있는 잠금 파일 수를 확인하십시오. 이것은 최선의 해결책이 아닐 수도 있습니다.

+0

나쁜 접근 방식이 아닙니다. 유일한 단점은 고아 pid 파일을 정리하는 또 다른 주기적으로 실행되는 스크립트가 필요하다는 것입니다. PHP (또는 그 언어에 대한 언어)가 항상 정상적으로 종료되는 것은 아닙니다. – mellowsoon

+0

@ mellowsoon : 파일 수정 시간을 확인하십시오. 5 분 이상이면 PID를 삭제하십시오. (time() - filemtime ($ path)> 5 * 60) – Wiliam

1

...

exec('ps -A | grep ' . escapeshellarg(basename(__FILE__)) , $results); 
if (count($results) > 4) { 
    echo "Already Running\n" 
    die(0); 
} 
+0

현재 솔루션보다 나은 접근 방법입니다. 전체 경로가 ps 출력에 포함되지 않았으므로 아마 basename (__ FILE__)을 사용해야 할 것입니다. 그러나 시스템에서 실행중인 유사하게 명명 된 스크립트와의 충돌을 여전히 방지하지는 못합니다. – mellowsoon

+0

@mellowsoon 아,'basename()'이 더 좋을 것입니다. 잊어 버렸습니다 : P. 'ps -A' 결과물을 보여 주면 PHP 파일과 완벽하게 일치해야하는 정규 표현식을 작성하겠습니다. – alex

+0

@alex, 알았습니다. 스크립트의 전체 경로가/home/mellowsoon/myscript라고 가정합니다. – mellowsoon