Как остановить выполнение jar-файла в bash-скрипте через 5 минут и запустить следующий?

Как остановить выполнение jar-файла в bash-скрипте через 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

Связанный контент