2012-08-24 5 views
0

대부분의 서버 측 스크립팅 언어는 exec 기능 (node, php, ruby 등)을 가지고 있습니다. 이렇게하면 프로그래밍 언어가 쉘과 상호 작용할 수 있습니다.백그라운드 프로세스, 로딩 막대

node.js에 exec()을 사용하여 브라우저에서 AJAX 요청과 관련된 대규모 프로세스를 실행하고 싶습니다. 진행 상황을 사용자에게 표시하기위한 간단한 진행 /로드 막대를 원합니다.

exec 함수의 콜백/비동기 특성으로 인해이 예제를로드하는 데 5 초 이상 걸린다는 것을 아래 예제에서 발견했습니다.

내가 원하는 것은로드 표시 줄과 같은 실행 상태로 업데이트 할 브라우저의 내용 (아약스)을 얻는 방법입니다. 그러나 나는 run 파일이 브라우저에 의존하는 것을 원하지 않습니다.

아이디어가 있으십니까?

내 경로

exports.exec = function(req,res){ 
    // http://nodejs.org/api.html#_child_processes 
    var sys = require('sys') 
    var exec = require('child_process').exec; 
    var child; 
    child = exec("node exec/test.js", function (error, stdout, stderr) { 
    var o = { 
     "error":error, 
     "stdout":stdout, 
     "stderr":stderr, 
    }; 
    o = JSON.stringify(o); 
    res.send(o); 
    }); 
}; 

내 test.js 당신은이에 대한 socket.io를 사용해야합니다

var sys = require('sys'); 

var count = 0; 

var interval = setInterval(
    function(){ 
     sys.print('hello'+count); 
     count++ 

     if(count == 5){ 
      clearInterval(interval); 
     } 

    }, 
1000); 

답변

6

파일. 여기에 demo app으로 socket.io를 시작하십시오.

socket.io를 사용하여 1 %마다 이벤트를 내 보내면 브라우저가이를 듣고 바를 업데이트합니다.

exec를 사용할 수없는 경우 스트리밍 된 출력이 필요합니다.
그러므로 child_process을 사용하고 싶습니다.

서버. 하위 과정에

var spawn = require('child_process').spawn, 
    exec = spawn('node exec/test.js'); 

exec.stdout.on('data', function (message) { 
    socket.emit('process', message); 
}); 

:

console.log('10%') 
// ... 
console.log('20%') 
// ... 
console.log('30%') 

귀하의 하위 프로세스는 훨씬 더 우아하고 뭔가를 할 수있는 노드 스크립트 인 경우. 스트림 stdout을 사용하지 않고 노드의 cluster 모듈을 사용하여 마스터와 슬레이브 프로세스간에 메시지를 보낼 수 있습니다.

이전 데모 앱의 fork에 이것을 구현하는 방법을 보여주는/exec를 추가했습니다.

다른 데모 앱을 만들 때 더 많은 시간을 할애 할 때 이것은 매우 흥미롭고 교육적인 테스트입니다. 아이디어를 가져 주셔서 감사합니다. D.

+0

감사합니다. 나는 지금 당신의 데모에서 socket.io 문서에 대해 깊이 생각하고 있습니다. 아무도 아직이 일을하지 않았다는 것을 믿는 것이 어렵습니다. 다른 언어로도 가능합니까? node.js와 socket.io가 이것에 가장 잘 맞을까요? – ThomasReggi

+0

@ThomasReggi : 웹 소켓 구현이있는 모든 언어/플랫폼에서이 작업을 수행 할 수 있습니다. 어떤 일을하고, 방출하고, 행사하십시오. 더 많은 일을하고, 다른 사건을 제출하십시오 ... 각 합계에서 당신은 처리 상태를 전달할 수 있습니다. – davidbuzatto

+0

답변을 추가 개발해 주셔서 감사합니다. 이것은 굉장합니다. express3과 socket.io를 포함한 repo에 감사드립니다. – ThomasReggi