2011-07-26 4 views
19

child_process.exec/child_process.spawn을 사용하여 새 프로세스를 포크 한 다음 child.kill/process.kill을 사용하여 종료합니다. cat/ls과 같은 간단한 바이너리 실행 파일에서 제대로 작동하며 하위 프로세스가 중단됩니다.Node.JS로 자식 프로세스가 죽지 않는다

그러나, 스크립트 (예를 들어 P1)그 포크 다른 자식 프로세스 (예를 들어 P2)에 도착, 전용 스크립트 인터프리터 (P1)가 살해 아닌 자식 프로세스 P2.

질문 : Node.JS와 같은 자식 프로세스 P2를 얻는 방법이 있습니까?

코드 run_and_kill('firefox')으로 run_and_kill('ls -Al /usr/lib')와 잘하지만, 확인되지 작동합니다

function run_and_kill(cmd) { 
    var exec = require('child_process').exec, 
     ls = exec(cmd); 
    console.log('Child process started: %d', ls.pid); 
    ls.on('exit', function(code, signal) { 
     console.log('exit with code %s and signal %s', code, signal); 
    }); 
    ls.kill(); 
} 
+0

수동으로 죽일 수 있습니다 (P2는 SIGHUP을 무시합니다). - http://stackoverflow.com/questions/392022/best-way-to-kill-all-child-processes –

+0

@AndreySidorov 수동으로 죽이는 방법/그 PID를 안다 고요? – Ghostoy

+0

알다시피 -'ls.pid' (https://github.com/joyent/node/blob/master/lib/child_process.js#L250) –

답변

1

내가 당신 P2 포크 또는 P1의 자식이 아니라 그것에 의해 산란 병렬 처리도 생각합니다. 파이어 폭스의 경우 (적어도 리눅스에서는) 파이어 폭스 앱은 래퍼 쉘 스크립트에 의해 시작된다. 항상 파이어 폭스가 될 경우 설치 폴더에서 바이너리를 직접 실행하는 것이 더 좋다.

3

나는 이것을 달성하기 위해 가장 안전한 방법은 child.pid를 인수로 사용하여 신호를 제거하는 스폰 프로세스를 만드는 것이다. 포크 예 :

var process; 
process = require('child_process'); 

var fork, child; 
fork = process.fork; 
child = fork('./index'); 

var spawn; 
spawn = process.spawn; 
spawn('kill', [child.pid]); 
console.log('sending SIGTERM to child process (socket server)'); 

나는 일반적으로 시작하는 대부분 beforeAll/Afterall는 블록, 사양에서 이것을 사용/서버를 죽이고 (예에서 './index.js').

+0

이 작업은 * 해당 하위 프로세스가 종료 된 경우에만 가능합니다.) –

관련 문제