web-dev-qa-db-fra.com

mon script nodejs ne se ferme pas de lui-même après une exécution réussie

J'ai écrit un script pour mettre à jour ma table db après avoir lu les données des tables db et solr. J'utilise le module asyn.waterfall. Le problème est que le script ne se ferme pas une fois toutes les opérations terminées. J'ai utilisé le pool de connexion db en pensant également que la création du script peut attendre infiniment. Je veux mettre ce script dans crontab et s'il ne se ferme pas correctement, cela créerait un tas d'instances inutilement.

29
Vickrant

Je viens de passer par ce problème.

Le problème avec simplement l'utilisation de process.exit() est que le programme sur lequel je travaille créait des poignées, mais ne les détruisait jamais.

Il traitait un répertoire et mettait des données dans orientdb.

donc certaines des choses que j'ai appris sont que les connexions à la base de données doivent être fermées avant de se débarrasser de la référence. Et cette process.exit() ne résout pas tous les cas.

Quand mon projet a traité 2000 fichiers. Il en resterait environ 500, et les poignées supplémentaires auraient rempli la mémoire de travail disponible. Ce qui signifie qu'il ne pourrait pas continuer. Par conséquent, ne jamais atteindre le process.exit à la fin.

En revanche, si vous fermez les éléments qui demandent à l'application de rester ouverte, vous pouvez résoudre le problème à sa source.

Les deux "fonctions non documentées" que j'ai pu utiliser étaient

process._getActiveHandles();
process._getActiveRequests();

Je ne sais pas quelles autres fonctions aideront à déboguer ces types de problèmes, mais ceux-ci étaient incroyables.

Ils renvoient un tableau et vous pouvez en savoir beaucoup sur ce qui se passe dans votre processus en utilisant ces méthodes.

J'espère juste que cela aidera quelqu'un d'autre à tomber sur ce post.

44
The Lazy Coder

Vous devez le dire lorsque vous avez terminé, en appelant

process.exit();

Plus précisément, vous voudrez appeler cela dans le rappel de async.waterfall () (le deuxième argument de cette fonction). À ce stade, tout votre code asynchrone s'est exécuté et votre script doit être prêt à quitter.

EDIT: Comme indiqué par @Aaron ci-dessous, cela a probablement à voir avec quelque chose comme une connexion à une base de données active, et ne permettant pas au processus de nœud de se terminer.

23
awinder

Vous pouvez utiliser le module de noeud why-is-node-running :

1) Exécutez npm install -D why-is-node-running

2) Ajoutez import * as log from 'why-is-node-running'; dans votre code

3) Lorsque vous vous attendez à ce que votre programme se termine, ajoutez une instruction de journal:

afterAll(async () => {
  await app.close();
  log();
}

Cela affichera une liste des poignées ouvertes avec une trace de pile pour savoir d'où elles proviennent:

There are 5 handle(s) keeping the process running
# Timeout
/home/maf/dev/node_modules/why-is-node-running/example.js:6  - setInterval(function () {}, 1000)
/home/maf/dev/node_modules/why-is-node-running/example.js:10 - createServer()

# TCPSERVERWRAP
/home/maf/dev/node_modules/why-is-node-running/example.js:7  - server.listen(0)
/home/maf/dev/node_modules/why-is-node-running/example.js:10 - createServer()
4
Kim Kern

Nous pouvons quitter l'exécution en utilisant:

connection.destroy();
4
Lusfikar Sheba