Tenho um script que emite 'oi', dorme por um segundo, produz 'oi', dorme por 1 segundo e assim por diante. Agora achei que seria capaz de resolver esse problema com este modelo.
var spawn = require('child_process').spawn,
temp = spawn('PATH TO SCRIPT WITH THE ABOVE BEHAVIOUR');
temp.stdout.pipe(process.stdout);
Agora, o problema é que a tarefa precisa ser concluída para que a saída seja exibida. Pelo que entendi, isso se deve ao fato de que o processo recém-gerado assume o controle de execução. Obviamente, node.js não oferece suporte a threads, então alguma solução? Minha ideia era possivelmente executar duas instâncias, a primeira com o propósito específico de criar a tarefa e fazer com que ela canalizasse a saída para o processo da segunda instância, considerando que isso pode ser alcançado.
node.js
spawn
capture-output
foklepoint
fonte
fonte
python
, não se esqueça de passar o-u
sinalizador para que ele não faça buffer da saída do console, caso contrário, parecerá que o script não estáRespostas:
Ainda estou começando a usar o Node.js, mas tenho algumas ideias. primeiro, acredito que você precisa usar em
execFile
vez despawn
;execFile
é para quando você tem o caminho para um script, enquantospawn
é para executar um comando conhecido que o Node.js pode resolver em relação ao caminho do sistema.1. Forneça um retorno de chamada para processar a saída em buffer:
2. Adicione um ouvinte ao fluxo stdout do processo filho ( 9thport.net )
Além disso, parece haver opções pelas quais você pode desanexar o processo gerado do terminal de controle do Node, o que permitiria que ele fosse executado de forma assíncrona. Eu não testei isso ainda, mas existem exemplos nos documentos da API que são mais ou menos assim:
fonte
child.spawn()
com ashell
opção definida comotrue
. nodejs.org/api/…child.stdout.pipe(process.stdout);
javascript let childProcess = exec ( './script-to-run --arg1 arg1value', ( error, stdout, stderror ) => { console.log( '[CALLBACK]: ' + error ); // or stdout or stderror } ); // Same as with spawn: childProcess.stdout.on ( 'data', ( data ) => { console.log( '[LIVE]: ' + data ); // Here's your live data! } );
É muito mais fácil agora (6 anos depois)!
Spawn retorna um childObject , com o qual você pode escutar eventos . Os eventos são:
Existem também vários objetos de childObject , são eles:
Veja mais informações aqui sobre childObject: https://nodejs.org/api/child_process.html
Assíncrono
Se você deseja executar seu processo em segundo plano enquanto o nó ainda é capaz de continuar a executar, use o método assíncrono. Você ainda pode optar por executar ações após a conclusão do processo e quando o processo tiver alguma saída (por exemplo, se você quiser enviar a saída de um script para o cliente).
child_process.spawn (...); (Nó v0.1.90)
Veja como você usaria um retorno de chamada + método assíncrono :
Usando o método acima, você pode enviar todas as linhas de saída do script para o cliente (por exemplo, usando Socket.io para enviar cada linha quando receber eventos em
stdout
oustderr
).Síncrono
Se você quiser que o nó pare o que está fazendo e espere até que o script seja concluído , você pode usar a versão síncrona:
child_process.spawnSync (...); (Nó v0.11.12 +)
Problemas com este método:
Como usá-lo:
fonte
child.stdout.setEncoding('utf8')
se quiser cordas utf8 chegando.stdout
forma assíncrona, ou seja, enquanto o programa restante continua, se o processo continua.console.log("Output 1"); console.error("Boom"); console.log("Output 2");
e eu estou fazendospawnAsync('node ./script.js')
... como você preserva a ordem da saída? Minha saída sempre parece sair na ordem incorreta.pipe
oupipeline
ou passar as opções apropriadas paraspawn
.Aqui está a abordagem mais limpa que encontrei:
fonte
Tive alguns problemas para obter a saída de registro do comando "npm install" quando gerei o npm em um processo filho. O registro em tempo real de dependências não foi mostrado no console pai.
A maneira mais simples de fazer o que o autor original deseja parece ser esta (gerar o npm no Windows e registrar tudo no console dos pais):
fonte
Eu me vi exigindo essa funcionalidade com freqüência suficiente para colocá-la em uma biblioteca chamada std-pour . Deve permitir que você execute um comando e visualize a saída em tempo real. Para instalar simplesmente:
Então é simples executar um comando e ver a saída em tempo real:
É prometido com base para que você possa encadear vários comandos. É até compatível com a assinatura de funções,
child_process.spawn
portanto, deve ser uma substituição em qualquer lugar que você esteja usando.fonte
criança:
pai:
fonte
Passthru semelhante a PHP
Uso
fonte
Adicionando uma resposta relacionada a
child_process.exec
como eu também precisava de feedback ao vivo e não receberia até depois que o script fosse concluído. Isso também complementa meu comentário para a resposta aceita, mas, à medida que for formatado, será um pouco mais compreensível e fácil de ler.Basicamente, eu tenho um script npm que chama Gulp, invocando uma tarefa que posteriormente usa
child_process.exec
para executar um script bash ou batch dependendo do sistema operacional. Qualquer um dos scripts executa um processo de construção via Gulp e, em seguida, faz algumas chamadas para alguns binários que funcionam com a saída do Gulp.É exatamente como os outros (spawn, etc.), mas para fins de conclusão, veja exatamente como fazer:
Agora é tão simples quanto adicionar um ouvinte de evento. Para
stdout
:E para
stderr
:Nada mal - HTH
fonte