簡體   English   中英

在Java中將Shell腳本作為線程執行

[英]Executing a shell script in java as a thread

我需要在Java程序中執行Shell腳本。 我發現我可以使用processbuilder和runtime.exec ..但我的Web服務器每180秒超時一次,但是我的腳本執行花費的時間更多。.我不想使用此方法的過程..還有其他方法我可以使用線程執行此操作。

謝謝。

我假設腳本的響應旨在供人類閱讀。

良好的界面設計和人性暗示,如果您的腳本運行需要超過180秒的時間,則應與Web服務器分開運行。 在Linux上,我建議將其放入“ cron”,並使其定期運行。 您只能通過Web服務器提供腳本的結果,而響應時間以秒為單位,而不是幾分鍾。

如果您的腳本依賴於http請求中的參數或僅在Web服務器環境中可用的其他信息,則可以選擇以下選項。

  1. 如果您可以找出可能的參數組合,請為每個參數組合自動運行腳本,再次僅通過網絡提供結果。
  2. 如果大部分時間都花在單個命令上,並且該命令的結果在兩次運行之間變化不大,則將該命令移至自動運行的單獨腳本中,然后使用該單獨腳本的結果構建網絡響應。
  3. 將響應分為幾部分,僅顯示每個請求的一部分數據,從而允許用戶翻閱響應。 腳本將被重寫為僅請求當前頁面的必要數據,從而減少了獲取該數據所需的時間。
  4. 用可編譯的語言重寫腳本,這可能使您有足夠的時間使每個請求的運行合理。 但是,如果問題是數據庫查詢,那么這對您沒有任何好處。 無論是否以可編譯的語言重寫了選項(3),您都必須使用它。

如果沒有其他信息,例如腳本示例或描述從何處獲得結果的描述,那是我所能做的最好的。

一個進程可以運行多個線程,但是它們仍然是該進程的一部分。

因此,Java程序中的所有線程都是Java進程的線程,並且一個線程無法運行另一個程序的線程。

Shell腳本由程序運行:shell程序! (/ bin / bash或/ bin / sh)

無論如何,shell腳本通常會在其他幾個進程中運行其他程序。

不,您不能在Java線程中運行Shell。

通常,如果您有與Java程序分離的代碼(例如在單獨腳本中的代碼),則沒有理由說明當該代碼可以集成到程序中時,為什么您的代碼將執行外部腳本。 充其量是不安全的。 因為外部腳本是可編輯的,所以您基本上允許程序執行任意代碼。 您正在做的事情對我來說聽起來幾乎應該只限於單元測試或構建任務。

作為單元測試任務,您可以在項目的測試階段使用線程化的JUnit運行程序運行外部腳本。

另外,與程序分開,您還可以使用Gradle任務和Gradle具有的parallellforks選項來執行它。

暫無
暫無

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

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