1. child_process 모듈, exec 함수
exec 함수에 다음과 같은 option 을 설정 가능하다.
cwd : 현재의 작업 디렉토리
encoding : child output에 대한 encoding (기본적으로 utf8로 ascii, ucs2, base64등으로 변경 가능하다)
timeout : 하위 프로세스의 실행 대기 시간(기본적으로 0, 무한 기다림)
maxBuffer : output(stdout/stderr)의 버퍼(기본적으로 200*1024)
killSignal : timeout 또는 output 버퍼가 다 찼을 경우에 하위 프로세스에 보낼 시그널(기본은 SIGTERM)
env : 하위 프로세스에 전달할 환경 변수(기본적으로 null)
예를 들어
var exec=require('child_process').exec;
var options={
timeout:10000,
killSignal:'SIGKILL'
};
exec ('cat *.js',options,function.....);
과 같이 호출 가능함
2. child_process 모듈, spawn 함수
spawn 함수로 child_process와 데이터를 주고 받는 예제
- child process
process.stdin.resume() -> 기본적으로 stdin 이 pause 상태이기 때문에 resume으로 stdin에서 입력 받음
- parent process
child.stdin 및 child.stdout으로 데이터를 하위 프로세스와 주고 받음
child.stdout.once를 사용한 이유는 setInterval에서 한번의 데이터를 전송하고 이에 대한 한번의 callback을 받기 위함, child.stdout.on을 이용하게 되면 여러번 callback함수를 등록하게 됨
- 실행 결과
3. 하위 프로세스의 종료 코드와 종료가된 시그널을 수신 받음
child.on('exit', function(code){
console.log('child process terminated with code ' + code);
});
signal도 수신하고 싶다면
child.on('exit',function(code,signal){
if(code){
console.log('child process terminated with code '+code);
} else if (signal){
console.log('child process terminated because of signal '+signal);
}
});
4. 하위 프로세스에 시그널 전달
상위 프로세스는 하위 프로세스에 시그널을 전송 가능하며, 이해하지 못하는 시그널을 수신시 하위 프로세스는 종료한다. 어떤 시그널을 하위 프로세스에서, 어떤 시그널은 운영체제가 처리한다.
var spawn=require('child_process').spawn;
var child=spawn('sleep',['10']);
setTimeout(function(){
child.kill('SIGUSR2');
},1000);
SIGUSR2와 같은 시그널을 하위 프로세스에서 다음과 같이 처리 가능하다.
process.on('SIGUSR2',function(){
console.log('Got a SIGUSR2 signal');
});
SIGKILL, SIGSTOP은 운영체제에서 처리하며 하위 프로세스에서 해당 시그널을 처리하는 함수를 만든다고 해도 운영체제게 해당 프로세스를 중지시킨다.