2017-12-19 17 views
2

Node.js를 8.9.1, 4.10.0-42 - 일반적인 리눅스 버전분리 된 하위 실행 후 부모 프로세스가 자동으로 종료되지 않는 이유는 무엇입니까?

부모

const { fork } = require('child_process'); 

const forked = fork('child.js', { 
    detached: true, 
    stdio: 'ignore' 
}); 

const config = { 
    name: 'trex', 
    interval: 2000 
}; 

forked.send(config); 
forked.unref(); 

for (let i = 0; i < 3; i++) { 
    console.log('do staff'); 
} 

아이

const work = function() { 
    let sum = 0; 
    for (let i = 0; i < 1e10; i++) { 
    sum += i; 
    } 
}; 

const start = function(config) { 
    setTimeout(function run() { 
    work(); 
    setTimeout(run, config.interval); 
    }, config.interval); 
}; 

process.on('message', function(config) { 
    start(config); 
}); 

내가 아이 종료를 시작하는 부모를 필요 정상적으로. 이제 node parent.js을 실행하면 부모가 계속 실행되는 것을 볼 수 있습니다.

[email protected]:~/dev/$ ps aux | grep -e "parent\|child" | grep node 
trex  5134 0.0 0.1 874016 29460 pts/11 Sl+ 10:44 0:00 node parent.js 
trex  5140 86.3 0.1 874108 30252 ?  Rsl 10:44 4:59 /home/trex/.nvm/versions/node/v8.9.1/bin/node child.js 

나는 process.exit()이 있음을 알고 있습니다. 그런데 왜 정상적으로 종료하지 않습니까? 내 애플 리케이션 부모에 setTimeout 루프 안에있다, 거기에 많은 논리이며 그것은 시간 간격으로 한 번만 실행해야합니다. https://nodejs.org/api/child_process.html 문서에서

+0

사용'forked.unref()'당신'forked.send 후()' – Keith

+0

@Keith 그럼에도 불구하고, 부모가 계속 실행되고, 시도했다. – trex

+0

윈도우즈에서이 기능을 시험해 보았는데 작동하는 것처럼 보였습니다. 여전히 분리되어 있습니다 : 진정한 의미입니까? .. stdio가 참고 사항을 지키는 경우에는 stdio : 'ignore'를 시도해보십시오. – Keith

답변

2

:

subprocess.disconnect는() #에 추가 : v0.7.2이 가 다른 연결 유지가 없을 일단 아이가 정상적으로 종료 할 수 있도록 부모와 자식 사이의 IPC 채널 을 닫습니다 살아있다. 이 메서드를 호출 한 후 의 subprocess.connected 및 process.connected 속성은 각각 부모와 자식이 모두 false로 설정되며 은 더 이상 프로세스간에 메시지를 전달할 수 없습니다.

수신중인 메시지가 없으면 'disconnect'이벤트가 발생합니다. subprocess.disconnect()를 호출 한 직후에 대부분 이 트리거됩니다. 자식 프로세스가 Node.js를 인스턴스 인 경우뿐만 아니라 IPC 채널을 닫으려면 process.disconnect() 메소드 자식 프로세스에서 호출 될 수있다 (예 child_process.fork()를 사용 스폰) 것을

참고 .

const work = function() { 
    let sum = 0; 
    for (let i = 0; i < 1e10; i++) { 
    sum += i; 
    } 
}; 

const start = function(config) { 
    setTimeout(function run() { 
    work(); 
    setTimeout(run, config.interval); 
    }, config.interval); 
}; 

process.on('message', function(config) { 
    start(config); 
    process.disconnect(); 
});