2013-04-30 3 views
0

다른 php cli 스크립트가 실행 중인지 PHP cli 스크립트가 감지 할 수있는 확실한 방법이 있습니까? 이 경우에 실행하면 명령 행에서 ps aux | grep scriptname.php을 수행하면 자체적으로 행을 반환한다는 의미입니다.하나의 PHP CLI 스크립트가 다른 PHP CLI 스크립트가 실행 중인지 감지 할 수 있습니까?

이 명령은 또한 출력에 자체를 반환하는 경향이 있으므로 단지 exec('ps aux | grep scriptname.php',$output);을 수행하면 위양성을 반환합니다.

또한 로그 항목을 만들지 만 일부 조건에서는 최대 5 분간 잠자기 상태가되므로 로그 항목을 검색하는 것이이 인스턴스에서 감지 할 수없는 원시적 인 방법입니다.

+1

왜 잠금 파일을 사용하여 여러 번의 호출을 감지하지 않습니까? – Barmar

+0

질문이나 근원적 인 문제를 해결할 지 결코 알 수 없습니다. 이 경우 필자는 대답에 대한 질문에 답변했지만 Barmar가 제안한 잠금 파일 사용 방법을 선호합니다. – leftclickben

+0

@Barmar 잠금 파일이 잠재적으로 작동 할 수 있지만 다중 호출 문제는 아닙니다. 이 경우에는 leftclickben의 답변이 나에게 덜 효과적 일 수 있다고 생각합니다. :) – AntonChanning

답변

2

여기의 leftclickben 대답 약간 간단한 버전입니다. 스크립트 이름에 한 글자를 []으로 입력하면 grep을 필터링하지 않아도됩니다.

exec('ps aux | grep "[s]criptname.php"', $output); 
+0

정말이에요? 방금 시도했다. (PHP가 아닌 커맨드 라인에서),'echo "foo bar"| grep bar' 그리고 나서'echo "foo bar"| grep "[b] ar"'두 경우 모두에서 히트를 기록했습니다. 또는 나는 무엇인가 놓치고 있냐? – leftclickben

+0

@leftclickben이 트릭은 ps의 출력을 grepping하는 것과 관련이 있습니다. 스크립트를 시작한 다음'ps aux | grep scriptname.php'와'ps aux | grep "[s] criptname.php"'. – Barmar

+1

* facepalm * 물론'ps' 명령에는 실제로 "scriptname.php"가 포함되지 않고 대괄호가있는 다른 문자열이 포함됩니다. 나는 배웠다 - 고마워 .--)이 게시물에 대한 첫 번째 의견은보다 완전한 설명을 가지고있다 : http://askubuntu.com/questions/153419/how-does-this-tricky-bracket-expression-in-grep-work – leftclickben

1

grep -v grep을 사용하여 "출력에서 자체 반환"부분을 필터링 할 수 있습니다. 또한 명령에 grep이없는 경우 즉, 그것은 단지 scriptname.php를 찾을 수 :

exec('ps aux | grep scriptname.php | grep -v grep', $output); 
+0

이것은'grep'을 걸러 낸다. 그러나 검사중인 스크립트의 인스턴스를 걸러 내지 않는다. – Barmar

+0

그래서 당신은 단지 하나가 아닌 두 개의 행을 찾습니다. 하나가 있다면 하나만 실행하고 두 개가 있다면 또 하나가 있습니다. – leftclickben

+0

@Barmar 검사중인 스크립트는 다른 것으로 불려 지므로이 경우 자체를 탐지해서는 안됩니다. 동일한 스크립트가 이미 실행 중인지를 누군가가 감지하고 싶다면 좋은 지적입니다 ... – AntonChanning

관련 문제