2014-03-30 2 views
1

mjpg_streamer와 함께 spawn 함수를 사용하고 있습니다. 그러나 자식 프로세스는 생성되는 즉시 종료됩니다. 여기에 내가 실제 명령 자체를 실행node.js 스폰. 즉시 종료 된 exit 이벤트

streamingProcess = spawn('mjpg_streamer', [ 
    '-i', '"/usr/local/lib/input_file.so -f ' + IMAGE_PATH + ' -n ' + IMAGE_NAME + '"', 
    '-o', '"/usr/local/lib/output_http.so -w /usr/local/www"' 
]); 

streamingProcess.on('exit', function(code, signal) { 
    console.log('streaming process has stopped. Code: ' + code + ', signal: ' + signal); 
    streamingProcess = null; 
}); 

을 사용하고있는 코드는 다음 반환 :

enter image description here

무엇 mjpg_streamer 명령이 기본적으로 수행하는 것은 웹 서버를 불입니다. exit 콜백의 코드는 1이고 신호는 null입니다.

무슨 일이 일어나고 있는지 아주 확실하지가 ...

업데이트 : 내가 exec를 사용하는 경우

, 다음 그것을 잘 작동합니다! 그러나 kill을 호출하면 프로세스가 종료되지 않습니다!

그래서
streamingProcess = exec('LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o "output_http.so -w /usr/local/www"'); 

은 실제로 웹 서버를 불 않지만, 지금은 종료 이벤트가 발생한다

streamingProcess.kill() 

호출하면,하지만 프로세스 자체는 죽지 않습니다. 추가 검사에서 pid (노드 하위 프로세스와 OS에서)가 동일하지 않은 것처럼 보입니다. ?? 지금은 혼란 스러워요

...

업데이트 2 :

좋아, 내가 exec에 무슨 일이 일어나고 있는지 이해하기 시작하고있다 생각합니다. 그래서 그것은 서브 쉘에서 명령을 실행하는데, 두 개의 프로세스를 생성하고 있습니다. 하나는 서브 쉘이고 다른 하나는 mjpg_streamer 명령입니다. 따라서 exec을 죽이면 서브 쉘 만 죽게됩니다. 그러나 mjpg_streamer는 남아 있습니다. 노드에서

:

enter image description here

운영 체제에서 :

enter image description here

그래서 3752 내가 죽이고 싶어 실제 명령입니다. 노드에서이 PID를 가져올 방법이 없다고 생각합니까? :)

답변

2

spawn 호출은 명령을 실행하지만 명령은 실패합니다 (종료 코드 1). 나는 이것이 당신이 산란 명령을 전달할 때 나타나는 여분의 따옴표로 인한 것이라고 생각합니다. 셸을 사용할 때 셸에서 공백이 포함 된 인수를 분할하지 않도록 큰 따옴표를 사용해야합니다. 스폰을 사용할 때는 사용하지 않아야합니다. 따라서 :

streamingProcess = spawn('mjpg_streamer', [ 
    '-i', '/usr/local/lib/input_file.so -f ' + IMAGE_PATH + ' -n ' + IMAGE_NAME, 
    '-o', '/usr/local/lib/output_http.so -w /usr/local/www' 
]); 

위의 명령에서 제거한 유일한 것은 큰 따옴표입니다.

그리고 exec의 pid 문제는 Node가 명령 자체의 PID 대신에 명령을 시작하는 셸의 PID를 얻는다는 것입니다.(이것은 명령 줄에 명령을 입력 할 때와 마찬가지로 exec에서 인수가 분할되지 않도록 이중 따옴표를 사용해야하는 이유도 설명합니다.

요약하면 spawn은 셸을 사용하지 않으므로 ' 공백 분할을 막기 위해 따옴표를 사용하십시오. 사용자가 얻는 PID는 명령의 PID입니다. 그러나 exec은 셸을 시작하여 명령을 실행하므로 따옴표가 필요하므로 셸의 PID를 가져옵니다.

+0

DUDE. 정말 고맙습니다! – Umair

관련 문제