2009-09-07 5 views
2

하나의 PHP 스크립트에서 proc_open을 사용하여 프로세스를 만들고 있습니다.프로세스를 종료하는 방법

다른 스크립트에서 어떻게 종료합니까? proc_open에 의해 반환 된 리소스를 전달할 수 없습니다.

또한 proc_get_status()를 사용하여 시도했지만 ppid를 반환합니다. 나는 아이들의 pid를 얻지 않는다.

개발 환경 : WAMP

모든 의견을 환영합니다.

+0

것 같아요 : 모든 프로세스 정보를 통해 처리하지 않고 방법은 없습니다 – tuergeist

+0

@ tuergeist, 그건 사실입니다. 유닉스가 좋아하는 사람들은 당신이 나중에 닫으라고 말할 수 있도록 그 프로세스를 열 때 파이프를 열 수도 있지만 PHP와 같은 상태 비 저장 시스템에서는 세션을 사용하지 않으면 호출 프로세스에 대한 참조를 잃어 버릴 수 있습니다. 비슷한 것. 결국, 당신은 proc을 닫는 방법을 알 수 있도록 어떤 것을 추적해야합니다. –

+0

업데이트가 좋을 것입니다. –

답변

3

모델을 다시 검사하여 실제로 다른 곳에서 프로세스를 종료해야한다는 점을 확인하는 것이 좋습니다. 대부분의 사소한 상황을 제외하고는 코드를 디버그하고 유지 보수하는 것이 점차 어려워 질 것입니다.

캡슐화 된 상태로 유지하려면 종료하려는 프로세스에 신호를 보내고 종료하려는 프로세스에서 정상적으로 종료하십시오. 그렇지 않으면 정상적인 IPC를 사용하여 "안녕, 친구. 제발, 제발."라는 메시지를 보낼 수 있습니다.

편집 : 두 번째 단락의 경우 여전히 스크립트를 실행하여 종료 할 수 있습니다. 괜찮아. 당신이 피하고자하는 것은 kill-9 유형의 것입니다. 대신 프로세스를 정상적으로 종료하십시오.

posix_kill($pid, 15); // SIGTERM = 15 
+0

것은 시작 및 중지 버튼이있는 html 페이지가 있습니다. 시작은 "start.php"라는 스크립트로 이동하여 새 프로세스를 만듭니다. 중지 버튼은 프로세스를 중지하거나 종료해야합니다. 어떻게해야합니까? 늘어나는만큼 기능을 별도의 스크립트로 작성해야한다고 생각할 수 있습니까? – Vidya

+0

나는 그렇게 생각하지 않는다. 당신은 scession 있습니다. 쿠키에 액세스 할 수 있습니다. 파일 시스템에 접근하여 파일 등을 쓸 수 있습니다 (실제로 보안 설정에 의존하지 않을 수도 있습니다). 확장 된 프로세스의 PID를 저장하고 나중에 불러 와서 위에서 언급 한 기술을 사용할 수 있습니다. 죄송 합니다만 정확한 구문을 알려 드릴 수 없습니다. 나는 영원히 그 종류의 물건을 직접 찾고 있습니다. –

+0

실제로, 몇 가지 작은 PHP 스크립트를 제외하고는 모두 정적 HTML 일 뿐이며, scession은 아마도 의문의 여지가 없습니다. –

0

일부 methond를 사용하여 프로세스를 만들 수 있습니다.이 메서드는 일반적으로 새 프로세스의 PID를 반환합니다.

이 기능이 작동합니까? :

$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env); 
$return_value = proc_close($process); 
+0

$ process 여기에 PID가 아닌 리소스가 있습니다. 이 스크립트를 다른 스크립트로 전달하여 종료 할 수는 없습니다. – Vidya

+0

아마도 $ process.pid가 있습니다. 아마 사용할 수있을 것입니다. 파일에 쓰기 (비효율적)하거나 네트워크를 통해 다른 프로세스 ("스크립트")로 보낼 수 있습니다. – bua

+0

$ process.pid는 "Resource id # 6pid"를 반환합니다. 이것으로 무엇을합니까? – Vidya

0

당신은 다른 프로세스를 시작하기 위해이 같은 것을 사용하는 것이 가장 좋은 선택 위치 :이 과정을 실행하고 당신에게 실행중인 프로세스의 ID를 줄 것이라고

$pid = shell_exec("nohup $Command > /dev/null 2>&1 & echo $!"); 

. 이 nobody로 실행되는 경우 - -

exec("ps $pid", $pState);  
$running = (count($pState) >= 2);  

당신은 PHP가에서 실행하는 사용자가 소유하지 않은 프로세스를 종료하지 못할, 당신은 항상 그러나

exec("kill $pid"); 

을 사용할 수 있습니다 종료하는 당신은 아무도로 새로운 프로세스를 시작합니다 사용자 nobody에서 실행중인 프로세스 만 죽일 수 있습니다.

+0

아니요 하나의 인스턴스에서 많은 명령을 보내야하므로 proc_open을 사용해야합니다. – Vidya

2

순수 PHP에서, 여기에 해결책이 수행합니다.
관련 문제