J'ai un script qui produit «salut», dort pendant une seconde, sort «salut», dort pendant 1 seconde, et ainsi de suite. Maintenant, je pensais que je serais capable de résoudre ce problème avec ce modèle.
var spawn = require('child_process').spawn,
temp = spawn('PATH TO SCRIPT WITH THE ABOVE BEHAVIOUR');
temp.stdout.pipe(process.stdout);
Maintenant, le problème est que la tâche doit être terminée pour que la sortie soit affichée. D'après ce que je comprends, cela est dû au fait que le processus nouvellement engendré prend le contrôle de l'exécution. De toute évidence, node.js ne prend pas en charge les threads, donc des solutions? Mon idée était d'exécuter éventuellement deux instances, la première dans le but spécifique de créer la tâche et de la faire diriger la sortie vers le processus de la deuxième instance, étant donné que cela peut être réalisé.
node.js
spawn
capture-output
foklepoint
la source
la source
python
n'oubliez pas de passer le-u
drapeau pour qu'il ne tamponne pas la sortie de la console, sinon il semblera que le script n'est pas en direct stackoverflow.com/a/49947671/906265Réponses:
Je me mouille toujours les pieds avec Node.js, mais j'ai quelques idées. d'abord, je crois que vous devez utiliser à la
execFile
place despawn
;execFile
est pour lorsque vous avez le chemin vers un script, alors quespawn
pour exécuter une commande bien connue que Node.js peut résoudre par rapport à votre chemin système.1. Fournissez un rappel pour traiter la sortie mise en mémoire tampon:
2. Ajoutez un écouteur au flux stdout du processus enfant ( 9thport.net )
En outre, il semble y avoir des options par lesquelles vous pouvez détacher le processus généré du terminal de contrôle de Node, ce qui lui permettrait de fonctionner de manière asynchrone. Je n'ai pas encore testé cela, mais il existe des exemples dans la documentation de l' API qui ressemblent à ceci:
la source
child.spawn()
avec l'shell
option définie surtrue
. 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! } );
C'est beaucoup plus facile maintenant (6 ans plus tard)!
Spawn renvoie un childObject , avec lequel vous pouvez ensuite écouter les événements . Les événements sont:
Il existe également un tas d' objets de childObject , ce sont:
Voir plus d'informations ici sur childObject: https://nodejs.org/api/child_process.html
Asynchrone
Si vous souhaitez exécuter votre processus en arrière-plan pendant que le nœud est toujours en mesure de continuer à s'exécuter, utilisez la méthode asynchrone. Vous pouvez toujours choisir d'effectuer des actions une fois votre processus terminé et lorsque le processus a une sortie (par exemple, si vous souhaitez envoyer la sortie d'un script au client).
child_process.spawn (...); (Nœud v0.1.90)
Voici comment vous utiliseriez une méthode de rappel + asynchrone :
En utilisant la méthode ci-dessus, vous pouvez envoyer chaque ligne de sortie du script au client (par exemple en utilisant Socket.io pour envoyer chaque ligne lorsque vous recevez des événements sur
stdout
oustderr
).Synchrone
Si vous voulez que node arrête ce qu'il fait et attend que le script se termine , vous pouvez utiliser la version synchrone:
child_process.spawnSync (...); (Nœud v0.11.12 +)
Problèmes avec cette méthode:
Comment l'utiliser:
la source
child.stdout.setEncoding('utf8')
si vous voulez que les chaînes utf8 arrivent.stdout
manière asynchrone, c'est-à-dire pendant que le programme restant continue, si le processus se poursuit.console.log("Output 1"); console.error("Boom"); console.log("Output 2");
et je faisspawnAsync('node ./script.js')
... comment préservez-vous l'ordre de la sortie? Ma sortie semble toujours sortir dans le mauvais ordre.pipe
oupipeline
ou passez les options appropriées àspawn
.Voici l'approche la plus propre que j'ai trouvée:
la source
J'ai eu un peu de mal à obtenir la sortie de journalisation de la commande "npm install" lorsque j'ai engendré npm dans un processus enfant. La journalisation en temps réel des dépendances ne s'affichait pas dans la console parent.
La façon la plus simple de faire ce que l'affiche originale veut semble être la suivante (générer npm sur Windows et tout enregistrer sur la console parent):
la source
Je me suis retrouvé à avoir besoin de cette fonctionnalité assez souvent pour que je l'ai intégrée dans une bibliothèque appelée std-pour . Il devrait vous permettre d'exécuter une commande et d'afficher la sortie en temps réel. Pour installer simplement:
Ensuite, il est assez simple d'exécuter une commande et de voir la sortie en temps réel:
Il est promis, vous pouvez donc enchaîner plusieurs commandes. Il est même compatible avec les signatures de fonction
child_process.spawn
, il devrait donc être remplacé partout où vous l'utilisez.la source
enfant:
parent:
la source
Passthru de type PHP
Usage
la source
Ajout d'une réponse liée au fait
child_process.exec
que j'avais moi aussi besoin de commentaires en direct et que je n'en recevais aucune avant la fin du script. Cela complète également mon commentaire à la réponse acceptée, mais comme il est formaté, il sera un peu plus compréhensible et plus facile à lire.Fondamentalement, j'ai un script npm qui appelle Gulp, invoquant une tâche qui utilise ensuite
child_process.exec
pour exécuter un script bash ou batch en fonction du système d'exploitation. Les deux scripts exécutent un processus de construction via Gulp, puis font des appels à certains binaires qui fonctionnent avec la sortie de Gulp.C'est exactement comme les autres (spawn, etc.), mais dans un souci d'achèvement, voici exactement comment le faire:
Maintenant, c'est aussi simple que d'ajouter un écouteur d'événement. Pour
stdout
:Et pour
stderr
:Pas trop mal du tout - HTH
la source