Existe-t-il un mécanisme sous Unix (ou Linux) pour arrêter un vidage de mémoire en cours?

15

Disons qu'un processus (très) volumineux plante et vide le noyau, et nous connaissons la cause à partir d'autres informations (peut-être un message d'assertion, peut-être autre chose).

Existe-t-il un moyen d'empêcher le vidage de mémoire d'être complètement généré, car c'est un gaspillage dans ce cas?

Par exemple, est-ce que tuer -9 d'un processus de vidage de mémoire interromprait la génération du fichier de mémoire?

Évidemment, si nous savions à l'avance que nous ne voulions pas de vidages de mémoire, nous pourrions définir ulimit de manière appropriée ou utiliser les divers utilitaires de contrôle de fichiers de base du système d'exploitation.

Mais cette question concerne la phase "core dump déjà en cours" ...

(Par exemple, imaginez que je suis le demandeur dans /programming/18368242/how-to-bypass-a-2tb-core-dump-file-system-limit et je ne veux pas gaspiller 5 -6 To d'espace disque :))

Mike G.
la source
Sous Linux, vous pouvez désactiver la génération du vidage de mémoire ... pourrait-il être une option?
krisFR
Non - les vidages de mémoire sont nécessaires en général, mais nous cherchons simplement un moyen de les arrêter dans les cas où nous savons quel est le problème sans avoir besoin du cœur, pour gagner du temps / de l'espace disque / etc ... Bien sûr, nous pouvons simplement supprimer le noyau une fois le vidage terminé (ou même le dissocier avant cela), mais il n'y a aucune raison de bloquer quelques espaces sur le disque si nous pouvions simplement tuer le vidage du noyau plus tôt.
Mike G.1
Vous pouvez éventuellement utiliser "cat / dev / null> <path_to_core>" dans le script appelant le programme lorsqu'une certaine condition est remplie, donc tant que l'entrée / proc / <pid> existe, dormez toutes les quelques secondes et exécutez le / dev / null copie dans le fichier core. Cela le mettra à zéro. Je ne suis pas sûr du contexte complet derrière la question, mais cela peut fonctionner.
Schrute
Schrute, cela aurait le même effet que de dissocier le noyau, n'est-ce pas? L'espace disque et les ressources système seraient toujours consommés jusqu'à ce que le cœur ait fini d'écrire - la taille du fichier ne serait tout simplement pas visible dans du ou ls.
Mike G.
Ressources oui, cependant c'est une méthode courante pour traiter un gros fichier tel que le fichier core / log et ne pas arrêter le PID. Cela dépend simplement de l'objectif.
Schrute

Réponses:

8

Généralement: non, il n'y a aucun moyen de tuer de manière fiable un coredump.

Cela étant dit, il existe une possibilité (au moins sous Linux) pour le commerce * NIX probablement aucun moyen

La possibilité réside dans le fait que la série 3.x du noyau est capable d'interrompre l'écriture des fichiers. Une possibilité est de trouver le thread qui fait le dumping et d'envoyer plusieurs fois SIGKILL jusqu'à ce qu'il réussisse.

Cette série de correctifs corrige le problème à un certain niveau.

Une autre possibilité est d'utiliser la syntaxe alternative pour le coredump_pattern. Le manuel indique que depuis 2.6.19 au lieu d'un modèle, vous pouvez utiliser un tuyau et un programme (avec des paramètres) qui gèrera le vidage. Ergo, vous aurez le contrôle du vidage qui sera écrit où (/ dev / null étant le candidat évident pour vos cœurs inutiles).

Ce correctif mérite également un peu d'attention: http://linux.derkeiler.com/Mailing-Lists/Kernel/2010-06/msg00918.html

zéridon
la source
Merci zéridon - c'est certainement la meilleure réponse jusqu'à présent.
Mike G.
Je pense que si vous utilisez le mécanisme de tuyauterie, vous pouvez simplement quitter sans lire les données de tuyau si vous savez que ce n'est pas quelque chose que vous voulez garder (à moins qu'un tuyau cassé ne crée un autre problème ... devrait le tester.)
Alexis Wilke
0

consultez ce lien, il peut être utile

https://publib.boulder.ibm.com/httpserv/ihsdiag/coredumps.html

Hamed Shahinnejad
la source
Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence.
Tom O'Connor
Merci Hamed, mais bien que ce lien contienne beaucoup d'informations intéressantes, je ne pense pas qu'il réponde à ma question (sauf si je l'ai raté - je ne suis pas encore tout à fait réveillé :))
Mike G.
-1

Il semble que vous puissiez exécuter ulimit -c (en supposant que vous utilisez bash) pour limiter la taille du vidage de mémoire.

Voir: /ubuntu/220905/how-to-remove-limit-on-core-dump-file-size

et

http://ss64.com/bash/ulimit.html

Kerry
la source
1
Kerry, comme je l'ai dit dans l'OP, "De toute évidence, si nous savions à l'avance que nous ne voulons pas de vidages de mémoire, nous pourrions définir l'ulimit de manière appropriée ou utiliser les divers utilitaires de contrôle de fichiers de base du système d'exploitation." J'essaie de voir s'il existe un moyen d'arrêter un vidage de mémoire une fois qu'il a déjà commencé pour une tâche très importante (pour économiser du temps / de l'espace disque / des ressources).
Mike G.