2015-12-01 15 views
7

現狀:我有一個網站,允許用戶使用共享託管服務器上的Python解釋器,以不同語言(特別是,我創建的esolang)執行任意代碼。我在一個單獨的進程中運行該代碼,該進程的時間限制爲60秒。如何自動殺死一個在Python中使用太多內存的進程?

問題:你可以做類似Python(相當於Python)10**(10**10),它比我分配給我的快速消耗更多的內存。它也顯然鎖定了Apache - 或者響應時間太長 - 所以我必須重新啓動它。

我見過this question,但給出的答案使用Perl,我根本不知道,因此我想在Python中得到答案。但是,操作系統也是 Linux。

具體來說,我想以下特點:自動

  1. 奔跑
  2. 強制殺死超過一些內存限制像1MB或100MB
  3. 任何進程殺死我的代碼產生的任何進程是比較比24小時老

我使用這段代碼(在Django視圖中)來創建過程並運行它(proxy_prgm是一個管理器,所以我可以ret rieve從被解釋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() 

如果您需要更多的細節,不要猶豫,告訴我該怎麼編輯(或問我問題)。

+2

一些想法:您可以使用ulimit來設置衍生進程的最大內存。你可以使用psutil來監視內存的使用情況,如果它失控,就可以殺死它。 – dbn

+1

我同意你應該使用你的操作系統的''ulimit'來監視資源。它可以用來確保你不會消耗文件鎖等其他資源。 – Maciek

+0

只是一個側面說明 - 一個看法似乎並不適合這樣的代碼給我。 –

回答

3

可能工作的另一種方法;使用resource.setrlimit()(更多詳情in this other StackOverflow answer)。看來這樣做你可以設置一個進程的內存限制,它是子進程;你必須弄清楚如何處理,如果極限被擊中,雖然。我沒有使用它的個人經驗,但希望這樣做會阻止Apache阻止你。