2 votes

NodeJS : Comment lire stdout et stderr d'un processus enfant généré par un processus explicitement lancé ?

J'ai récemment travaillé sur un serveur de construction à la demande. Le serveur de construction est une API REST NodeJS/Express, qui enveloppe essentiellement l'interface de ligne de commande Angular CLI et les outils de construction associés pour compléter une application Angular à la demande personnalisée.

Tout fonctionne comme prévu de bout en bout, mais j'aimerais pouvoir obtenir des rapports d'état plus détaillés, car les constructions Angular peuvent être assez longues lorsque l'on prend en compte 2 parties très longues du processus

Les deux parties les plus longues du processus :

  1. l'npm install (généralement automatiquement lancé via l'esquéma ng-new de la collection de schémas @angular/schematics par défaut)
  2. la commande ng build.

Le 2 est facile à gérer, car je lance ce processus (ng build --prod) via child_process.spawn() directement.

Le 1 s'est révélé un peu plus compliqué, car le processus npm install à longue exécution est en fait lancé en interne par la commande/esquème Angular ng-new par défaut. Donc, si ma réflexion est correcte, il s'agit essentiellement d'un processus enfant explicitement lancé (mon ng new lancé) qui lance internement npm install.

Une solution de contournement que j'ai trouvée est de passer l'argument --skip-install à ng new, ce qui empêchera le processus interne npm install d'être lancé par le schéma. En faisant cela, je peux alors manuellement lancer npm install via child_process.spawn() et observer directement les flux de sortie standard et d'erreur.

Je suis curieux de savoir si quelqu'un sait comment espionner les flux d'erreur standard et de sortie standard du 'npm install' lancé à l'intérieur de ma commande ng new explictement lancée?

Merci!

0voto

mihai Points 7035

Si vous utilisez Linux, vous pouvez utiliser strace pour espionner la sortie d'un autre processus.

strace -p7835 -e trace= -e write=3

Consultez cette réponse pour plus de détails.

Vous pouvez bien sûr invoquer strace à partir de node, en utilisant spawn. Pour trouver le pid du processus npm (qui est en fait un processus node), vous devrez obtenir l'arborescence des processus en utilisant la commande ps. Il existe déjà un module node qui fait cela : ps-tree, qui semble également fonctionner sur plusieurs plateformes.

Pour des alternatives à strace sur Windows, consultez cette discussion. Je recommanderais d'utiliser Process Monitor de Sysinternals.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X