簡體   English   中英

使用Runtime.exec()從servlet運行Linux進程

[英]Running linux process from servlet useing Runtime.exec()

在多用戶環境中運行linux進程是個好主意。

例如:Runtime rt = Runtime.getRuntime(); 進程proc = rt.exec(“ linux command”); int exitVal = proc.waitFor(); //可能要等5至10分鍾

您需要注意一些事項:

  • 如果該進程使用文件,則必須確保每個進程都有自己的集合,否則它們將覆蓋彼此的輸入/輸出。 使用File.createTempFile()

  • 進程將以服務器的用戶權限運行。

  • 如果該進程獲取用戶可以在瀏覽器中更改的數據,請確保他不能發送諸如"; rm -rf /"

  • 如果該過程運行了幾秒鍾,那么您必須在后台運行它並解析輸出以查看它何時完成。 由於錯誤處理,這很快就會變得繁瑣,您需要在會話中保留對正在運行的進程的引用,等等。

除此之外,沒有理由擔心。 Unix是一種服務器操作系統,旨在同時運行許多進程:)

這是一個非常糟糕的主意。

  1. 必須以受限帳戶調用Tomcat。 所以您可能會因為權限問題而頭痛
  2. 用戶將超時,因此永遠不會傳遞HTTP內容
  3. 沒有授予servlet不會終止的授權-因此您的進程將是僵屍

嘗試啟動過程,但是通過看門狗模式並通過客戶端瀏覽器的定期ping監視它們

您對運行時環境的了解還不夠。 盡管問題標題提到servlet,並且該問題已用servlet標記,但您未指定任何特定的運行時環境。

您問題的答案取決於與用例有關的非常具體的情況。 例如,如果您有一個人流量大的站點,在該站點上訪問任何頁面都可能會產生一個新的過程,該過程將運行幾分鍾,這聽起來並不是一個好的設計,因為任何服務器都可以輕松地進行爬網。這樣的情況。 另一方面,如果您有一些特定的長期運行任務需要在單獨的流程中運行並通過訪問網頁來觸發,在該網頁中這種訪問和流程的創建是受控的和確定性的,則可以這樣做這個。 沒有實際的技術障礙。

請注意,如果您正在使用Java的最新版本,則使用ProcessBuilder被認為比使用舊的Runtime.exec更可取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM