¿Cómo detener un archivo jar en ejecución en un script bash después de 5 minutos e iniciar el siguiente?

¿Cómo detener un archivo jar en ejecución en un script bash después de 5 minutos e iniciar el siguiente?

Tengo que ejecutar un archivo jar con diferentes parámetros como este:

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

Si, digamos, el segundo tardó más de cinco minutos, quiero detenerlo y continuar con el siguiente. Entonces el tiempo máximo para cada frasco en ejecución es de 5 minutos. Si se necesita menos que eso, está bien; pero si uno se ejecuta por más tiempo, el script debe continuar con el siguiente.

Respuesta1

Esto debería funcionar en bash 4 o posterior:

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

Para versiones anteriores:

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

Después de buscar un poco una versión pura de Java, encontréeste:

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

Respuesta2

Si su sistema tiene el timeoutcomando, debería poder usarlo, como

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

información relacionada