現狀:我有一個網站,允許用戶使用共享託管服務器上的Python解釋器,以不同語言(特別是,我創建的esolang)執行任意代碼。我在一個單獨的進程中運行該代碼,該進程的時間限制爲60秒。如何自動殺死一個在Python中使用太多內存的進程?
問題:你可以做類似Python(相當於Python)10**(10**10)
,它比我分配給我的快速消耗更多的內存。它也顯然鎖定了Apache - 或者響應時間太長 - 所以我必須重新啓動它。
我見過this question,但給出的答案使用Perl,我根本不知道,因此我想在Python中得到答案。但是,操作系統也是 Linux。
具體來說,我想以下特點:自動
- 奔跑
- 強制殺死超過一些內存限制像1MB或100MB
- 任何進程殺死我的代碼產生的任何進程是比較比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()
如果您需要更多的細節,不要猶豫,告訴我該怎麼編輯(或問我問題)。
一些想法:您可以使用ulimit來設置衍生進程的最大內存。你可以使用psutil來監視內存的使用情況,如果它失控,就可以殺死它。 – dbn
我同意你應該使用你的操作系統的''ulimit'來監視資源。它可以用來確保你不會消耗文件鎖等其他資源。 – Maciek
只是一個側面說明 - 一個看法似乎並不適合這樣的代碼給我。 –