web-dev-qa-db-fra.com

Comment attendre la fin d'un processus enfant dans Node.js?

J'exécute un script Python via un processus enfant dans Node.js, comme ceci:

require('child_process').exec('python celulas.py', function (error, stdout, stderr) {
    child.stdout.pipe(process.stdout);
});

mais Node n'attend pas que ça se termine. Comment puis-je attendre la fin du processus?

EDIT: Est-il possible de faire cela en exécutant le processus enfant dans un module que j'appelle à partir du script principal?

13
David

Vous devriez utiliser exec-sync

Cela permet à votre script d'attendre que votre exécution soit terminée

vraiment facile à utiliser:

var execSync = require('exec-sync');

var user = execSync('python celulas.py');

Jetez un coup d’œil à: https://www.npmjs.org/package/exec-sync

3
Frederic Nault

Utilisez l'événement exit pour le processus enfant.

var child = require('child_process').exec('python celulas.py')
child.stdout.pipe(process.stdout)
child.on('exit', function() {
  process.exit()
})

PS: Ce n'est pas vraiment un doublon, car vous ne voulez pas utiliser le code de synchronisation à moins d'en avoir vraiment besoin.

40
alex

Vous devez supprimer les installations de listeners exec à ajouter à stdout et stderr en mémoire tampon. Même si vous ne passez aucun rappel, il restitue la sortie en tampon. Le nœud va toujours quitter le processus enfant dans la mémoire tampon est dépassé dans ce cas.

var child = require('child_process').exec('python celulas.py');
child.stdout.removeAllListeners("data");
child.stderr.removeAllListeners("data");
child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
2
Kristofor Selden

À mon avis, la meilleure façon de gérer cela consiste à implémenter un émetteur d'événements. Lorsque la première apparition est terminée, émettez un événement indiquant qu'il est terminé.

const { spawn } = require('child_process');
const events = require('events');
const myEmitter = new events.EventEmitter();


firstSpawn = spawn('echo', ['hello']);
firstSpawn.on('exit'), (exitCode) => {
    if (parseInt(code) !== 0) {
        //Handle non-zero exit
    }
    myEmitter.emit('firstSpawn-finished');
}

myEmitter.on('firstSpawn-finished', () => {
    secondSpawn = spawn('echo', ['BYE!'])
})
0
TylersSN