Как остановить запущенный 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)
Если, скажем, второй занял больше пяти минут, я хочу остановить его и перейти к следующему. Таким образом, максимальное время для каждой пробирки составляет 5 минут. Если это займет меньше, это нормально; но если он выполняется дольше, сценарий должен перейти к следующему.
2 ответа
Если ваша система имеет timeout
команда, вы должны быть в состоянии использовать его, как
timeout 300s java -jar IPM.jar 0 20 3 sign.txt
︙
Это должно работать в 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);