2014-12-05 5 views
2

리눅스에서 USB 드라이브 제거를 확인합니다. 나는 단순히 child_process.spawn을 사용하여 명령 줄 프로세스의 출력을 모니터링하고 있습니다. 그러나 어떤 이유로 인해 아동의 표준 출력 데이터 이벤트는 20 줄이 인쇄 될 때까지 방출되지 않으므로 제거 된 드라이브를 감지 할 수 없습니다. 여러 번 드라이브를 제거한 후 마침내 사라집니다. 그러나 분명히 그렇게하지 않을 것입니다. 원래노드가 stdout.on 데이터 지연을 스폰합니다

:

매우 간단

var udevmonitor = require("child_process").spawn("udevadm", ["monitor", "--udev"]); 
 
udevmonitor.stdout.on("data", function(data) { 
 
    return console.log(data.toString()); 
 
});
. 그래서 이것은 배관 노드가 내부적으로 사용하고있는 문제입니다. 따라서 파이프를 사용하는 대신 간단한 패스 스트림을 사용합니다. 그게 문제를 해결하고 나에게 실시간 결과를 줄 수 있습니다.

var stdout = new require('stream').PassThrough(); 
 
require("child_process").spawn("udevadm", ["monitor", "--udev"], { stdio: ['pipe', stdout, 'pipe'] }); 
 

 
stdout.on("data", function(data) { 
 
    console.log(data.toString()); 
 
});

그러나 그것은 나에게 오류가 있습니다 : 그 코드는 child_process.js : 922 던져 새로운 형식 오류 ('표준 입출력 스트림에 대한 잘못된 값 :'+ 표준 입출력을);

문서에서 스트림을 전달할 수 있다고 말합니다. 내가 잘못하고있는 것을 보지 못하고 child_process 소스를 단계별로 실행하는 것이 도움이되지 않습니다.

누군가 도움을 줄 수 있습니까? Linux를 사용 중이라면이 프로그램을 직접 실행할 수 있습니다. 코드를 실행하고 USB 드라이브를 삽입하십시오. 아마도 다른 터미널에서 'udevadm monitor --udev'명령을 실행하여 어떤 일이 발생하는지 볼 수 있습니다. 제거하고 몇 번 다시 삽입하면 결국 노드가 인쇄됩니다.

+1

[여기] (http://unix.stackexchange.com/a/25378)와 같이 stdout 버퍼링을 피하기 위해'stdbuf '를 사용하도록 명령 줄을 변경해 보셨습니까? – mscdex

답변

2

mscdex, 여러분을 사랑합니다.

spawn("stdbuf", ["-oL", "-eL", "udevadm", "monitor", "--udev"]);

에 스폰 명령을 변경 트릭을했다. 도와 주셔서 정말 고맙습니다.

+0

안녕하세요, tcpdump와 작동하지 않습니다. 이유는 무엇입니까? –

관련 문제