2013-03-02 156 views
4

我給用戶一種靈活的方式來使用JavaScript來轉換數據,並在服務器端使用Node.js執行。與設計,有三個問題需要考慮:如何使用node.js設置腳本的最大執行時間?

  • 安全:我使用sandbox,以避免本地的Node.js庫的使用解決了安全問題。

  • 資源:我們可以使用v8選項--max_executable_size輕鬆設置最大內存使用量。關於CPU使用率,我會看到如何使用cpulimitrenice來管理它,現在它並不重要。

  • 時間:我需要限制我的腳本的執行時間,以避免它們作爲hangry殭屍運行。在這裏,我卡住了。

我想是這樣的:

node -e ' 
    setTimeout(function() { 
     console.log("timeout"); 
     process.exit; 
    }, 5000); 
    console.log("begin"); 
    while (1); 
' 

但這個代碼僅顯示「開始」,似乎我的超時永遠不會被調用。 有什麼想法?

+0

這些是你的腳本嗎?還是你想限制任意代碼的執行?你是否想要在整個應用程序上設置一個時間限制?或者內部的一段代碼? – Brad 2013-03-02 16:19:00

+0

我想限制其中一段代碼的執行。 – 2013-03-02 16:20:23

+1

你的「while(1);」阻止執行,刪除它,你會看到開始和超時。 – 2013-03-02 16:21:06

回答

3

不幸的是,如果您的用戶可以啓動阻止操作(如while(1)),則無法告訴節點在一段時間後退出,因爲阻止操作將阻止處理器觸發。要麼確保用戶啓動的東西不會阻止主循環,要麼(這是一個壞主意)使用某種外部自動kill/timeout來銷燬節點進程。

基本上,您可以使用Node來限制非阻塞代碼的執行時間,但是Node的全部重點是阻塞代碼阻塞了所有內容。如果您的用戶真的能夠運行任意代碼,我會考慮在更高級別運行您的進程管理器/超時殺手:例如,使用Node的exec工具產生具有kill超時的進程。

+0

嗯,好的,在這種情況下,我會在'node'命令之前使用'timeout 5s',這也會導致我的流程失效。不管怎麼說,還是要謝謝你。 – 2013-03-02 16:42:16

+0

如果你走這條路線,確保你的Node進程正在做的事情是:a)如果在操作過程中中止,它不會中斷任何事情; b)不會在系統上留下未釋放的資源(這發生在某些程序發送'kill -9'時)。 – 2013-03-02 16:45:06

+0

實際上,我使用的[sandbox](http://gf3.github.com/sandbox/)完成了你正在談論的事情(我看到一些超時後的高管和sigkills,由父進程管理)。沒有看到它,因爲所有的例子都使用了默認值......不管怎麼樣。 – 2013-03-02 18:24:59

7

你可能想看看tripwire(https://github.com/tjanczuk/tripwire)。這是一個可以殺死失控節點腳本的模塊,您可以設置超時。它是一個本地節點模塊,所以這是一件需要考慮的事情,但它適用於Mac,Windows和Linux。

+0

我的問題現在有點老,但你的答案看起來很有趣。 – 2014-06-09 21:46:44

+0

@AlainTiemblo哈哈我現在明白了。這是從我的團隊中剛剛發現此問題的人員那裏傳給我的。現在,任何人都可以在那裏搜索。 :p – 2014-06-10 01:12:16

+1

是的,這就是爲什麼「Necromancer」徽章存在的原因:-)一些新的答案可以更好地適應舊問題。感謝分享。 – 2014-06-10 07:27:28