실행 : stdout“live”표시
나는이 간단한 스크립트를 가지고있다 :
var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee', function(error, stdout, stderr) {
console.log(stdout);
});
여기서 간단히 커피 스크립트 파일을 컴파일하는 명령을 실행합니다. 그러나 명령은 절대 종료되지 않기 때문에 (stupout은 콘솔에 표시되지 않음)-커피의 -w 옵션으로 인해). 콘솔에서 직접 명령을 실행하면 다음과 같은 메시지가 나타납니다.
18:05:59 - compiled my_file.coffee
내 질문은 : node.js exec와 함께 이러한 메시지를 표시 할 수 있습니까? 그렇다면 어떻게? !
감사
를 사용하지 마십시오 exec
. spawn
어떤 EventEmmiter
객체를 사용하십시오 . 그럼 당신은들을 수 있습니다 stdout
/ stderr
이벤트 ( spawn.stdout.on('data',callback..)
) 가 발생하기로 .
NodeJS 문서에서 :
var spawn = require('child_process').spawn,
ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', function (data) {
console.log('stdout: ' + data.toString());
});
ls.stderr.on('data', function (data) {
console.log('stderr: ' + data.toString());
});
ls.on('exit', function (code) {
console.log('child process exited with code ' + code.toString());
});
exec
출력을 버퍼링하고 일반적으로 명령 실행이 끝나면 출력을 반환합니다.
exec
EventEmitter 인 ChildProcess 객체도 반환합니다.
var exec = require('child_process').exec;
var coffeeProcess = exec('coffee -cw my_file.coffee');
coffeeProcess.stdout.on('data', function(data) {
console.log(data);
});
또는 pipe
자식 프로세스의 표준 출력을 기본 표준 출력으로 설정하십시오.
coffeeProcess.stdout.pipe(process.stdout);
또는 스폰을 사용하여 stdio를 상속
spawn('coffee -cw my_file.coffee', { stdio: 'inherit' });
그들 중 누구도 사용되는이 수행하는 가장 좋은 (쉬운) 방법은 언급하지 그러나 몇 가지 답변이 이미 있습니다 spawn
와 { stdio: 'inherit' }
옵션 . 예를 들어에서 진행 정보를 표시 할 때 가장 정확한 출력을 생성하는 것 같습니다 git clone
.
간단히 이렇게하십시오 :
var spawn = require('child_process').spawn;
spawn('coffee', ['-cw', 'my_file.coffee'], { stdio: 'inherit' });
이 의견 에서 이것을 지적한 것에 대해 @MorganTouvereyQuilling에게 감사드립니다 .
생성 된 프로세스에서 버퍼 문자열을 출력 할 때 발생하는 작은 문제 console.log()
는 줄 바꿈을 추가하여 생성 된 프로세스 출력을 추가 행에 분산시킬 수 있다는 것입니다. 출력 할 경우 stdout
또는 stderr
으로 process.stdout.write()
대신 console.log()
에, 당신은 '있는 그대로'를 양산 과정에서 콘솔 출력을 얻을 수 있습니다.
나는 그 해결책을 여기에서 보았습니다 : Node.js : 줄 바꿈없이 콘솔에 인쇄합니까?
누군가가 위의 솔루션을 사용하는 데 도움이되기를 바랍니다 (문서에서 가져온 경우에도 라이브 출력에 큰 솔루션입니다).
Nathanael Smith의 답변과 Eric Freese의 의견에서 영감을 얻은 결과는 다음과 같습니다.
var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee').stdout.pipe(process.stdout);
이 작업을 수행하는 유틸리티에 사용자 정의 exec 스크립트를 추가하면 도움이됩니다.
utilities.js
const { exec } = require('child_process')
module.exports.exec = (command) => {
const process = exec(command)
process.stdout.on('data', (data) => {
console.log('stdout: ' + data.toString())
})
process.stderr.on('data', (data) => {
console.log('stderr: ' + data.toString())
})
process.on('exit', (code) => {
console.log('child process exited with code ' + code.toString())
})
}
app.js
const { exec } = require('./utilities.js')
exec('coffee -cw my_file.coffee')
다른 모든 답변을 검토 한 결과 다음과 같이 끝났습니다.
function oldSchoolMakeBuild(cb) {
var makeProcess = exec('make -C ./oldSchoolMakeBuild',
function (error, stdout, stderr) {
stderr && console.error(stderr);
cb(error);
});
makeProcess.stdout.on('data', function(data) {
process.stdout.write('oldSchoolMakeBuild: '+ data);
});
}
때로는 data
여러 줄이 있으므로 여러 줄에 대해 oldSchoolMakeBuild
머리글이 한 번 나타납니다. 그러나 이것은 그것을 바꿀만큼 귀찮지 않았습니다.
child_process.spawn returns an object with stdout and stderr streams. You can tap on the stdout stream to read data that the child process sends back to Node. stdout being a stream has the "data", "end", and other events that streams have. spawn is best used to when you want the child process to return a large amount of data to Node - image processing, reading binary data etc.
so you can solve your problem using child_process.spawn as used below.
var spawn = require('child_process').spawn,
ls = spawn('coffee -cw my_file.coffee');
ls.stdout.on('data', function (data) {
console.log('stdout: ' + data.toString());
});
ls.stderr.on('data', function (data) {
console.log('stderr: ' + data.toString());
});
ls.on('exit', function (code) {
console.log('code ' + code.toString());
});
참고URL : https://stackoverflow.com/questions/10232192/exec-display-stdout-live
'programing tip' 카테고리의 다른 글
안드로이드에서 원형 ProgressBar를 만드는 방법은 무엇입니까? (0) | 2020.06.10 |
---|---|
MySQL : 테이블을 만들 수 없음 (errno : 150) (0) | 2020.06.10 |
오류 1045 (28000) : 사용자 'root'@ 'localhost'에 대한 액세스가 거부되었습니다 (암호 사용 : 예). (0) | 2020.06.10 |
pm2가 'npm start'스크립트를 실행할 수 있습니까 (0) | 2020.06.10 |
Android ListView에서 프로그래밍 방식으로 특정 위치로 스크롤 (0) | 2020.06.10 |