如何在 bash 腳本中停止正在運行的 jar 檔案 5 分鐘並啟動下一個?

如何在 bash 腳本中停止正在運行的 jar 檔案 5 分鐘並啟動下一個?

我必須運行具有不同參數的 jar 文件,如下所示:

#!/bin/bash
cd /Users/hawkarhama/Desktop/RUN 
echo $(java -jar IPM.jar 0 20 3 sign.txt)
echo $(java -jar IPM.jar 1 20 3 sign.txt)
echo $(java -jar IPM.jar 2 20 3 sign.txt)

比如說,如果第二個花了超過五分鐘,我想停止它並繼續下一個。所以每個運行jar的最長時間是5分鐘。如果需要的時間少於這個時間,那也沒關係;但如果一個腳本運行時間超過該時間,則腳本必須繼續下一個腳本。

答案1

這應該適用於 bash 4 或更高版本:

#!/bin/bash
cd /Users/hawkarhama/Desktop/RUN 
( cmdpid=$BASHPID; (sleep 300; kill $cmdpid ) & exec java -jar IPM.jar 0 20 3 sign.txt )
( cmdpid=$BASHPID; (sleep 300; kill $cmdpid ) & exec java -jar IPM.jar 1 20 3 sign.txt )
( cmdpid=$BASHPID; (sleep 300; kill $cmdpid ) & exec java -jar IPM.jar 2 20 3 sign.txt )

對於先前的版本:

#!/bin/bash
cd /Users/hawkarhama/Desktop/RUN 
bash -c '(sleep 300; kill $$) & exec java -jar IPM.jar 0 20 3 sign.txt'
bash -c '(sleep 300; kill $$) & exec java -jar IPM.jar 1 20 3 sign.txt'
bash -c '(sleep 300; kill $$) & exec java -jar IPM.jar 2 20 3 sign.txt'

在搜尋了一些純java版本後,我發現:

ScheduledExecutorService executor = Executors.newScheduledThreadPool(2); 
final Future handler = executor.submit(new Callable(){ 
     DoStuffHere();
});
executor.schedule(new Runnable(){
     public void run(){
         handler.cancel();
     }      
}, 5*60*1000, TimeUnit.MILLISECONDS);

答案2

如果您的系統有該timeout命令,您應該能夠使用它,如下所示

timeout 300s java -jar IPM.jar 0 20 3 sign.txt

相關內容