如何在 5 分钟后停止 bash 脚本中正在运行的 jar 文件并启动下一个?

如何在 5 分钟后停止 bash 脚本中正在运行的 jar 文件并启动下一个?

我必须运行具有不同参数的 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 分钟。如果运行时间少于 5 分钟,则没有问题;但如果运行时间超过 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

相关内容