web-dev-qa-db-fra.com

Tuer automatiquement un processus s'il dépasse une quantité donnée de RAM

Je travaille sur des jeux de données à grande échelle. Lors du test d'un nouveau logiciel, un script m'arrive parfois sur moi, récupère rapidement toute la mémoire RAM disponible et rend mon bureau inutilisable. Je voudrais un moyen de définir une limite RAM pour un processus afin que si elle dépasse cette quantité, il sera tué automatiquement. Une solution spécifique à une langue ne fonctionnera probablement pas, car j'utilise toutes sortes d'outils différents (R, Perl, Python, Bash, etc.).

Y a-t-il une sorte de moniteur de processus qui me permette de définir un seuil de RAM et de tuer automatiquement un processus s'il en utilise davantage?

12
chrisamiller

Je déteste être le gars qui répond à sa propre question, mais ce matin, j'ai trouvé une méthode alternative, intégrée dans un petit utilitaire de Nice. Cela limitera le temps CPU ou la consommation de mémoire:

https://github.com/pshved/timeout

Je donne un coup de feu à celui-ci en premier, mais je demande à Amey Jah de me donner une réponse positive. Je vais vérifier si celui-ci me manque.

10
chrisamiller

Je conseillerais fortement de ne pas le faire. Comme suggéré par @chrisamiller, définir ulimit limitera le RAM disponible avec le processus.

Néanmoins, si vous insistez, suivez cette procédure.

  1. Enregistrez le script suivant sous le nom killif.sh:

    #!/bin/sh
    
    if [ $# -ne 2 ];
    then
        echo "Invalid number of arguments"
        exit 0
    fi
    
    while true;
    do
        SIZE=$(pmap $1|grep total|grep -o "[0-9]*")
        SIZE=${SIZE%%K*}
        SIZEMB=$((SIZE/1024))
        echo "Process id =$1 Size = $SIZEMB MB"
        if [ $SIZEMB -gt $2 ]; then
            printf "SIZE has exceeded.\nKilling the process......"
            kill -9 "$1"
            echo "Killed the process"
            exit 0
        else
            echo "SIZE has not yet exceeding"
        fi
    
        sleep 10
    done
    
  2. Maintenant, rendez-le exécutable.

    chmod +x killif.sh
    
  3. Maintenant, lancez ce script sur le terminal. Remplacez PROCID par l'ID de processus réel et SIZE par la taille en Mo.

    ./killif.sh PROCID SIZE
    

    Par exemple:

    ./killif.sh 132451 100
    

    Si SIZE vaut 100, le processus sera tué si son utilisation de RAM dépasse 100 Mo.

Attention: Vous savez ce que vous essayez de faire. Tuer le processus n'est pas une bonne idée. Si ce processus comporte une commande d'arrêt ou d'arrêt, éditez le script et remplacez la commande kill -9 par cette commande shutdown.

9
Amey Jah

Essayez l'outil prlimit à partir du package util-linux. Il exécute un programme avec des ressources limitées. Il utilise l'appel système prlimit pour définir les limites, qui sont ensuite appliquées uniquement par le noyau.

Vous pouvez configurer 16 limites, y compris:

  • quantité maximale de temps processeur en secondes
  • nombre maximum de processus utilisateur
  • taille maximale du groupe de résidents ("mémoire utilisée")
  • taille maximale qu'un processus peut verrouiller en mémoire
  • taille de la mémoire virtuelle
  • nombre maximum de fichiers ouverts
  • nombre maximum de verrous de fichiers
  • nombre maximum de signaux en attente
  • nombre maximal d'octets dans les files d'attente de messages POSIX
2
Bram Geron