2013-08-18 17 views
0

我正在開發一個小型的週末項目,它基本上是一個在線IDE,它允許您從瀏覽器運行PHP,Ruby或Python代碼。我有一切設置和工作,但是我創建系統的方式,如果用戶運行的是寫得不好的腳本,或者是運行繁重的腳本,那麼系統可能會減慢每個人的速度,直到達到超時(15秒)。在沙盒模式下運行PHP,Ruby或Python進程

我的系統沒有通過斐波納契測試。我該如何運行該過程的隔離,這將允許用戶創建:

while (true) { fibonacci() } // pseudo-code 

沒有崩潰的服務器?我已經考慮採取行動的以下課程:

  • 運行多克爾(https://www.docker.io)容器內的每一個過程,但我不知道如何與慢容器
  • 搬運工交易運行內部VM
  • 每個進程在瞬間創建的EC2實例中運行的每一個進程(這是不是一個真正的選擇,因爲這是緩慢且昂貴)
+0

爲什麼不運行在客戶端腳本? – rlms

+3

在線IDE中在客戶端運行PHP/Ruby?這沒有任何意義。 – vinnylinux

+0

IDE可能處於聯機狀態,但按下執行按鈕後,會啓動客戶端計算機上的進程。客戶機管道輸出到服務器,顯示它。 – rlms

回答

0

你應該使用multiprocessing模塊產生另一個過程,然後運行用戶代碼內催生了親因此將輸入的代碼「隔離」在另一個進程中。但是,您仍然應該記住,您應該始終在虛擬機中運行此操作,因爲在某個虛擬機之外運行它在多個級別上都是不安全的。

使用這種方法,可以降低進程的優先級,因爲你在linux中,這應該保持每個進程。在超時運行時減慢整個機器的速度。這假設你確實在運行一個linux系統。

+0

他只是說它不起作用,因爲它會消耗所有資源。 –

+0

是的,這就是我現在用PHP和Python所做的。然而,即使這個過程是「孤立的」,一個寫得很差的腳本(比如我提到的斐波那契代碼)會使整個機器變慢,直到超時。 – vinnylinux

+0

http://blog.chr1s.at/2013/02/fibonacci-crash-dont-let-students-code.html –

0

嘗試將進程限制爲只有一個CPU內核。

您可以使用taskset的做到這一點:

http://linux.die.net/man/1/taskset

您也可以隔離使用isolcpus(和你的系統進程將不使用核),並使用taskset的運行你的CPU內核之一該CPU核心中的PHP/Ruby/Python代碼。

瞭解更多關於isolcpus:

Whole one core dedicated to single process

https://askubuntu.com/questions/165075/how-to-get-isolcpus-kernel-parameter-working-with-precise-12-04-amd64