2014-01-06 2 views
3

나는 30 초마다 cron 작업을 실행하고 몇 분 동안 실행되는 PHP 스크립트 파일을 가지고 있습니다. X 인스턴스를 동시에 실행할 수 있으므로 스크립트의 X 양이 이미 실행중인 경우 새 시작된 스크립트가 종료되고 실행중인 스크립트가 하나 이상 종료되면 다음 cron이 종료됩니다. 스크립트를 성공적으로 시작할 수 있어야합니다.PHP 스크립트가 cron에서 실행할 수있는 인스턴스의 양

뮤텍스와 같이 단 1 개의 인스턴스로 제한하는 것에 대한 정보를 찾았습니다. 그래서 나는 내가 원하는 것을 달성하기 위해 사용할 수있는 어떤 솔루션을 생각하고, 여기에 내가 가진 아이디어 중 일부입니다 : 스크립트가 완료되면 파일에

  • 를 사용하여 MySQL 데이터베이스 트랙 스크립트 실행
  • 저장의 PID는 PID를 제거
  • 코드에 쉽게 될 것으로 보인다 때문에 ps 명령 방법을 사용하여쪽으로 생각이 기울고 간단한 PS + 그렙 명령

에게 임를 실행합니다. 누군가가 더 나은 방법을 알고 있습니까?

+1

이 어떻게 30 초마다 실행을? 이런 종류의 접근법이 완전히 피할 수 있기 때문에 실제로 달성하려는 것을 이야기 할 수 있습니까? –

+0

왜 각 인스턴스에 대한 파일을 작성하지 않았습니까? 예를 들어 한 번에 최대 1 개의 인스턴스를 원합니다. 하나의 파일을 만듭니다. cron이 시작될 때 - 파일이 존재하면 - 작업을 실행하지 않습니다. 존재하지 않는 경우 - 파일을 생성하고, 작업을 실행하고, 파일을 삭제하십시오. –

답변

0

IMO, 가장 좋은 방법은 ps + grep 명령입니다.

MySQL과 pid 솔루션 모두 사용할 수 있지만 스크립트가 완료되기 전에 어떤 이유로 든 스크립트가 항상 죽을 수 있으므로 주어진 시간에 실행되는 스크립트의 수를 나타내지 않는 카운터를 남겨 둘 수 있습니다.

0

"추신 U"사용 : 크론 만 분으로 입도를 지원하는 경우

if(ifFirstInstance()==false){ 
    echo "ERROR: script already running.\n"; 
    die; 
    } 

//continue here 

function ifFirstInstance(){ 
    $basename = basename($_SERVER['SCRIPT_NAME']); 
    ob_start(); 
    system("ps u", $return); 
    $result = ob_get_contents(); 
    ob_end_clean(); 
    $pieces = count(explode($basename, $result)); 
    $pieces--; 
    if($pieces < 2) 
     return true; 
    else 
     return false; 
    } 
관련 문제