Exec : stdout "live" 표시
다음과 같은 간단한 스크립트가 있습니다.
var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee', function(error, stdout, stderr) {
console.log(stdout);
});
명령을 실행하여 커피 스크립트 파일을 컴파일할 수 있습니다.그러나 명령이 종료되지 않기 때문에 (커피의 -w 옵션 때문에) stdout은 콘솔에 표시되지 않습니다.콘솔에서 직접 명령을 실행하면 다음과 같은 메시지가 표시됩니다.
18:05:59 - compiled my_file.coffee
제 질문은: node.js exec을 사용하여 이러한 메시지를 표시할 수 있습니까?만약 그렇다면 어떻게?!
사용 안 함exec다음 중 어느 것을 사용합니까?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);
});
ORpipe아동 과정은 주요 아동 학생들에게 노출되어 있습니다.
coffeeProcess.stdout.pipe(process.stdout);
또는 스패닝을 사용하여 stdio 상속
spawn('coffee -cw my_file.coffee', { stdio: 'inherit' });
이미 여러 개의 답변이 있지만 이를 위한 최선의(그리고 가장 쉬운) 방법을 언급하는 답변은 없습니다.spawn옵션을 선택할 수 있습니다.예를 들어 의 진행 정보를 표시할 때 가장 정확한 출력을 생성하는 것으로 보입니다.git clone.
간단히 다음 작업을 수행합니다.
var spawn = require('child_process').spawn;
spawn('coffee', ['-cw', 'my_file.coffee'], { stdio: 'inherit' });
@MorganTouveryQuilling이 이 논평에서 이를 지적한 것에 대해 공로를 돌립니다.
Nathanel Smith의 답변과 Eric Freese의 의견에 영감을 받아 다음과 같이 간단하게 설명할 수 있습니다.
var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee').stdout.pipe(process.stdout);
생성된 프로세스에서 버퍼 문자열을 출력할 때 발생하는 한 가지 작은 문제를 추가하고 싶습니다.console.log()즉, 생성된 프로세스 출력을 추가 라인에 분산시킬 수 있는 새 라인을 추가합니다.출력하는 경우stdout또는stderr와 함께process.stdout.write()대신에console.log()그러면 생성된 프로세스에서 콘솔 출력을 '있는 그대로' 얻을 수 있습니다.
여기서 그 솔루션을 보았습니다. Node.js: 줄 바꿈 없이 콘솔로 인쇄하시겠습니까?
위의 솔루션을 사용하는 누군가에게 도움이 되기를 바랍니다(설명서를 참조하더라도 실시간 출력에 매우 유용함).
이 작업을 수행하는 유틸리티에 사용자 정의 Exec 스크립트를 추가하는 것이 유용하다는 것을 알게 되었습니다.
공익 사업제이에스
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.dll은 stdout 및 stderr 스트림이 있는 개체를 반환합니다.stdout 스트림을 눌러 하위 프로세스가 노드로 다시 보내는 데이터를 읽을 수 있습니다.stdout은 스트림이 가진 "데이터", "끝" 및 기타 이벤트를 포함합니다. sna는 자식 프로세스가 노드에 많은 양의 데이터를 반환하기를 원할 때 가장 잘 사용됩니다. 이미지 처리, 이진 데이터 읽기 등.
따라서 아래와 같이 child_process.dll을 사용하여 문제를 해결할 수 있습니다.
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());
});
여기 제게 도움이 되는 것처럼 보이는 유형 스크립트로 작성된 비동기 도우미 기능이 있습니다.수명이 긴 프로세스에는 효과가 없을 것으로 예상되지만 여전히 누군가에게 유용할 수도 있습니다.
import * as child_process from "child_process";
private async spawn(command: string, args: string[]): Promise<{code: number | null, result: string}> {
return new Promise((resolve, reject) => {
const spawn = child_process.spawn(command, args)
let result: string
spawn.stdout.on('data', (data: any) => {
if (result) {
reject(Error('Helper function does not work for long lived proccess'))
}
result = data.toString()
})
spawn.stderr.on('data', (error: any) => {
reject(Error(error.toString()))
})
spawn.on('exit', code => {
resolve({code, result})
})
})
}
언급URL : https://stackoverflow.com/questions/10232192/exec-display-stdout-live
'programing' 카테고리의 다른 글
| iframe에 CSS를 어떻게 적용합니까? (0) | 2023.05.29 |
|---|---|
| 리플렉터에 대한 오픈 소스 대안? (0) | 2023.05.29 |
| 원격 서버의 Mongodump (0) | 2023.05.29 |
| Rect를 그리거나 그렇지 않으면 Rect를 그리거나 하지 않습니다(drawRect/Core Graphics 대 subview/images 중 언제 사용해야 하며 그 이유는 무엇입니까?) (0) | 2023.05.29 |
| Android용 Eclipse에서 ProGuard 사용 (0) | 2023.05.29 |