Wie stoppt man eine laufende JAR-Datei in einem Bash-Skript nach 5 Minuten und startet die nächste?

Wie stoppt man eine laufende JAR-Datei in einem Bash-Skript nach 5 Minuten und startet die nächste?

Ich muss eine JAR-Datei mit unterschiedlichen Parametern wie folgt ausführen:

#!/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)

Wenn beispielsweise das zweite Skript länger als fünf Minuten gedauert hat, möchte ich es stoppen und mit dem nächsten fortfahren. Die maximale Zeit für jedes laufende Jar beträgt also 5 Minuten. Wenn es weniger dauert, ist das in Ordnung; wenn eines jedoch länger dauert, muss das Skript mit dem nächsten fortfahren.

Antwort1

Dies sollte in Bash 4 oder höher funktionieren:

#!/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 )

Für frühere Versionen:

#!/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'

Nach einiger Suche nach einer reinen Java-Version fand ichDas:

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);

Antwort2

Wenn Ihr System über den timeoutBefehl verfügt, sollten Sie ihn verwenden können, da

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

verwandte Informationen