Comment est-ce que je tue automatiquement un processus qui utilise trop de mémoire avec Python?

La situation: J’ai un site Web qui permet aux utilisateurs d’exécuter du code arbitraire dans une autre langue (en particulier, un esolang que j’ai créé), en utilisant un interpréteur Python sur un serveur d’hébergement partagé. J’exécute ce code dans un processus distinct qui dispose d’un délai de 60 secondes.

Le problème: Vous pouvez faire des choses comme (équivalent Python) 10**(10**10) , qui consum rapidement beaucoup plus de mémoire que je ne l’ai atsortingbué. Il semble aussi que Apache soit bloqué – ou que cela prenne trop de temps à répondre – je dois donc le redémarrer.

J’ai vu cette question , mais la réponse donnée utilise Perl, que je ne connais pas du tout, donc je voudrais une réponse en Python. Cependant, le système d’exploitation est Linux.

Plus précisément, je souhaite les caractéristiques suivantes:

  1. Fonctionne automatiquement
  2. Force-kills tout processus qui dépasse une certaine limite de mémoire comme 1 Mo ou 100 Mo
  3. Tue tout processus généré par mon code qui a plus de 24 heures

J’utilise ce morceau de code (dans une vue Django) pour créer le processus et l’exécuter ( proxy_prgm est un gestionnaire pour que je puisse récupérer les données du programme interprétant le code esolang):

 prgmT[uid] = multiprocessing.Process( target = proxy_prgm.runCatch, args = (steps,), name="program run") prgmT[uid].start() prgmT[uid].join(60) #time limit of 1 minute if prgmT[uid].is_alive(): prgmT[uid].terminate() proxy_prgm.stop() 

Si vous avez besoin de plus de détails, n’hésitez pas à me dire quoi éditer (ou me poser des questions).

Une autre approche qui pourrait fonctionner; using resource.setrlimit () (plus de détails dans cette autre réponse StackOverflow ). Il semble que cela vous permette de définir une limite de mémoire pour un processus et ses sous-processus; vous devrez trouver comment gérer si la limite est atteinte si. Je n’ai pas d’expérience personnelle en l’utilisant, mais j’espère que cela empêcherait Apache de vous enfermer.