4 votes

Comment garder un processus enfant forké en vie dans Node.js

Je veux créer un cli RabbitMQ qui fonctionne comme Forever.js avec node. Il peut engendrer des child_process et les maintenir en cours d'exécution en arrière-plan et peut communiquer avec les child_process à tout moment. Le problème auquel je suis confronté est que lorsque le programme cli principal se termine, le child_process semble également s'arrêter, j'ai essayé de bifurquer avec detached:true et .unref() mais cela ne fonctionne pas. Comment puis-je exécuter un child process en arrière-plan même après la sortie du processus appelant parent ?

cli.js - parent

const { fork, spawn } = require('child_process');
const options = {
  stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
  slient:true,
  detached:true
};

child = fork('./rabbit.js', [], options)

child.on('message', message => {
  console.log('message from child:', message);
  child.send('Hi');
  // exit parent
  process.exit(0);
});

child.unref()

rabbit.js - child s'il est en cours d'exécution, 'i' devrait continuer à s'incrémenter

var i=0;
i++;
if (process.send) {
  process.send("Bonjour"+i);
}

process.on('message', message => {
  console.log('message from parent:', message);
});

4voto

yaswanth Points 1137

Je pense que fork n'a pas d'option detached. Référez-vous à la documentation de node pour fork.

Si vous utilisez spawn, l'enfant continue de s'exécuter même si le parent se termine. J'ai légèrement modifié votre code pour utiliser spawn.

cli.js

const { fork, spawn } = require('child_process');
const options = {
  slient:true,
  detached:true,
    stdio: [null, null, null, 'ipc']
};

child = spawn('node', ['rabbit.js'], options);
child.on('message', (data) => {
    console.log(data);
    child.unref();
    process.exit(0);
});

rabbit.js

var i=0;
i++;
process.send(i);
// cela peut être un serveur http ou une connexion à une file rabbitmq. Utilisation de setInterval pour la simplicité
setInterval(() => {
    console.log('yash');
}, 1000);

Je pense qu'en utilisant fork, un canal IPC est établi entre le processus parent et le processus enfant. Vous pourriez essayer de déconnecter le canal IPC de manière propre avant de quitter le processus parent. Je vais essayer et mettre à jour la réponse si cela fonctionne.

Mise à jour :

J'ai mis à jour cli.js et rabbit.js pour le faire fonctionner comme demandé. L'astuce est d'utiliser le descripteur de fichier ipc dans les options stdio. De cette façon, vous pouvez communiquer avec le parent depuis l'enfant. Les trois premiers fd seront les valeurs par défaut s'ils sont marqués comme null. Pour plus d'informations, consultez la documentation sur les options de stdio

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