2015-12-01 11 views
7

La situazione: Ho un sito Web che consente alle persone di eseguire codice arbitrario in una lingua diversa (in particolare, un esolang che ho creato), utilizzando un interprete Python su un server di hosting condiviso. Eseguo questo codice in un processo separato a cui viene assegnato un limite di tempo di 60 secondi.Come si elimina automaticamente un processo che utilizza troppa memoria con Python?

Il problema: Si può fare cose del genere (Python equivalente) 10**(10**10), che consuma rapidamente gran lunga più memoria di quanto io abbia assegnato a me. Inoltre, apparentemente, blocca Apache - o ci vuole troppo tempo per rispondere - quindi devo riavviarlo.

Ho visto this question, ma la risposta data utilizza Perl, che non conosco affatto, quindi mi piacerebbe una risposta in Python. L'OS è anche Linux.

In particolare, voglio le seguenti caratteristiche:

  1. viene eseguito automaticamente
  2. Forza-uccide qualsiasi processo che supera un certo limite di memoria come 1 MB o 100 MB
  3. Uccide qualsiasi processo generato dal mio codice che è più di 24 ore

io uso questo pezzo di codice (in una vista Django) per creare il processo ed eseguirlo (proxy_prgm è un gestore così posso ret Rieve dati del programma che è l'interpretazione del codice di Tarantopedia):

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() 

Se avete bisogno di ulteriori informazioni, non esitate a dirmi cosa modificare (o farmi domande).

+2

Alcune idee: è possibile utilizzare ulimit per impostare la memoria massima del processo generato. Puoi usare psutil per monitorare l'uso della memoria e ucciderlo se ti sfugge di mano. – dbn

+1

Sono d'accordo che dovresti usare il tuo sistema operativo 'ulimit' per controllare le risorse. Può essere usato per assicurarsi di non consumare altre risorse come i blocchi di file. – Maciek

+0

Solo una nota a margine - una vista non sembra essere il posto giusto per tale codice per me. –

risposta

3

Un altro approccio che potrebbe funzionare; utilizzando resource.setrlimit() (ulteriori dettagli in this other StackOverflow answer). Sembra che così facendo puoi impostare un limite di memoria su un processo ed è un sottoprocesso; dovrete capire come gestire se il limite viene colpito però. Non ho esperienza personale che lo usi, ma spero che farlo impedisca a Apache di bloccarti.

Problemi correlati