2013-07-24 3 views
2

내가 예를 들어, PHP의 경유()를 통해 리눅스 명령을 실행 해요 :PHP 스크립트를 죽일 때 패스 프로세스 프로세스를 죽이는 방법은 무엇입니까?

<?php 
file_put_contents("script.pid", getmypid()); 
passthru("sleep 500", $exit); 

는 이제 스크립트를 죽이고 싶은 말은. 나는 script.pid에 열거 된 프로세스를 죽일 것이다. 그러나 이로 인해 sleep 500 (또는 모든 프로세스)이 백그라운드에서 실행됩니다. exit 반환 변수에 passthru()를 사용하고 있지만 system() 및 shell_exec()에서 동일한 결과를 얻습니다. 누구나이 솔루션이 백그라운드에서 실행되는 이유에 대한 해결책이나 이유를 알고 있습니까?

답변

3

기능 passthru()은 명령을 실행하기 위해 쉘을 생성 한 다음 경유 프로세스가 리턴 될 때까지 차단합니다. 그것들은 스크립트를 실행하는 PHP 인터프리터와 다른 프로세스 ID를 가진 독립적 인 프로세스입니다. 스크립트를 죽일 수는 있지만 시작한 프로세스는 죽이지 않습니다.

그러나 스폰 된 프로세스는 동일한 프로세스 그룹 ID (PGID)이며이를 사용하여이를 삭제하거나 다른 신호를 보낼 수 있습니다. 우리의 경우 PGID는 PHP 스크립트의 프로세스 ID (PID)와 동일합니다.

당신이 명령을 실행 할 수 있습니다 PGIDs를 보려면 : PS의 axjf을 당신은 같은 것을 얻을 것이다 :

PPID PID PGID SID TTY  TPGID STAT UID TIME COMMAND 
24077 12484 12484 24077 pts/9 12484 S+ 1000 0:00 | \_ php sleepScript.php 
12484 12486 12484 24077 pts/9 12484 S+ 1000 0:00 |  \_ sh -c sleep 500 
12486 12487 12484 24077 pts/9 12484 S+ 1000 0:00 |   \_ sleep 500 

우리의 예에서 PGID는 (PHP 스크립트의 PID와 동일) 12484 및 전송하는 것입니다 이 그룹 A와, 신호를 종료 PGID 앞에 음의 부호로 kill 명령을 사용하여, 예 :

kill -15 -24077 

을 당신은 세 가지 프로세스를 종료 된 것입니다.

+0

명확한 설명에 감사드립니다. – Devon