Technical Note/Node.js
http://www.hacksparrow.com/difference-between-spawn-and-exec-of-node-js-child_process.html

`spawn` `exec`가 하는 작업은 동일하지만, 

`spawn`은 스트림(stream)을 리턴하고, `exec`는 버퍼(buffer)를 리턴한다.

`spawn`은 `stdout`과 `stderr` 스트림을 포함한 객체를 리턴한다.
자식 프로세스의 표준 출력을 `stdout` 객체로 받아 처리할 수 있다.
`stdout` 객체는 `data`와 `end` 등의 이벤트를 발생한다.
`spawn`은 자식 프로세스로부터 많은 양의 데이터를 받는 경우에 유용한다.
예) 이미지 프로세싱이나 바이너리 데이터를 읽어오는 등


`exec`는 자식 프로세스 버퍼의 아웃풋을 리턴한다.
버퍼의 사이즈는 기본값은 200k이다.
만약, 자식 프로세스가 버퍼 사이즈보다 더 큰 값을 리턴하면,
"Error: maxBuffer exceeded" 오류가 나면서 프로그램이 종료될 것이다.
버퍼 사이즈를 크게 늘리면 해결할 수는 있으나,
`exec`는 큰 사이즈의 버퍼 처리를 위한 것이 아니다.
이런 경우라면 `spawn`을 사용하는 게 적합하다.
`exec`는 데이터 대신 상태 정도의 작은 결과를 출력하는 프로그램을 실행하는 용도로 사용한다.

또 하나,
`spawn`은 비동기로 실행하고, 결과도 비동기로 받는다.
`exec`는 동기로 실행하고, 결과는 비동기로 받는다.

정리: 자식 프로세스로부터 큰 바이너리 데이터를 리턴받는 경우라면 `spawn`을,
간단한 상태 메시지만 받는 것이라면 `exec`를 쓴다.


상황에 따라 `spawn`  `exec`를 사용한 예


1 0
  • hanK 2015.06.23 16:04    

    안녕하세요.

    node js를 공부하고 있는데요.
    비동기식으로 작동시키는 방법이 exec라고 하더라구요.

    A.
    서버에 하나의 주소창에는
    1.~~/start를 호출하고
    다른 주소창에는
    2. ~~/upload를 호출합니다.

    B.
    index쪽에서 받아내서 response를 해주기 위해서
    1번 주소를 받게되면 start함수가 실행되고
    2번 주소를 받게 되면 upload함수가 실행되게 했습니다.


    C.
    그런데 원래는 하나의 thread로 javascript가 작동하니, while문이 도는 동안에는
    두번째 upload가 실행이 되질 않습니다. 즉 upload는 whie문이 끝난 다음에 실행이 됩니다.

    D.
    그래서 비동기식 함수실행인 exec를 사용했습니다.
    그런데 작동을 안하거나, 여전히 while문에 걸어준 9000시간 이후에 upload가 실행합니다. 어떻게 해야할까요?

    var exec = require("child_process").exec;
    function start(response){
    console.log("Request handler 'start' was called");



    exec( "ls -lah",
    { timeout: 10000, maxBuffer: 20000*1024 },
    function(error,stdout,stderr){
    response.writeHead( 200, {"Content-Type": "text/plain"} );
    response.write(stdout);

    function sleep(milliSeconds) {
    var startTime = new Date().getTime();
    while (new Date().getTime() < startTime + milliSeconds);

    response.write("exec print");
    }

    sleep(9000);


    response.end();



    });



    }

    function upload(response){
    console.log("Request handler 'upload' was called");
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello Upload");
    response.end();
    }

    exports.start = start;
    exports.upload = upload;