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

1

Я должен запустить файл 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 минут. Если это займет меньше, это нормально; но если он выполняется дольше, сценарий должен перейти к следующему.

Hk148
источник
(1) Если вы спрашиваете конкретно о программе Java, которую вы можете изменить, один из подходов может заключаться в том, чтобы встроить ограничение по времени в код Java. (2) Почему вы говорите, echo $(…)вместо того, чтобы просто запустить программу java -jar IPM.jar … sign.txt?
G-Man
Потому что echo$вы правы, и я делал это раньше, это была просто копия кода, который я поместил здесь. Что касается кода Java, я не знаю, как это сделать программно. Я пытался, System.CurrentTimeMillesно это не работает.
Hk148

Ответы:

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);
NuTTyX
источник
спасибо за ответ. Он все еще запускает процесс через 5 минут. kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec], Это дает мне эту строку после того, как каждый процесс занимает более 5 минут. и он все еще запускается, что не то, что я хочу.
Hk148
@ Hk148: Я получил это на работу, в несколько искусственном тесте. (Я получил kill: (1234) - No such processсообщение для каждого вызова, который завершался до истечения времени.) Вы уверены, что набираете его правильно? (Попробуйте скопировать и вставить.) Какую операционную систему вы используете?
G-Man
Недостатком этого метода является вывод «процесса уничтожения» и «отсутствия такого процесса». Я попытался запустить его 2>&1 >/dev/nullпосле команды kill, но он не пропустил вывод, так что для ясности я пропустил это в решении. Я тестировал его на Cygwin, а не на действительно UNIX-оболочке, но аргументы для таких команд, killкак большинство, должны быть такими же, как и у большинства Linux-
систем
@ G-Man Я использую Mac OSX, но проблема в том, что через 5 минут он не запускает следующий тест или следующую строку. Через 5 минут он просто останавливает все.
Hk148
@NuTTyX есть ли другие способы сделать это в коде Java?
Hk148
1

Если ваша система имеет timeoutкоманду, вы можете использовать ее, как

timeout 300s java -jar IPM.jar 0 20 3 sign.txt
    ︙
G-Man
источник
man timeoutили info coreutils 'timeout invocation'иметь полную помощь. Это часть GNU coreutils .
Хастур
@ G-Man Когда я пытаюсь это сказать, он говорит timeout: command not found. Я думаю, что эта версия не может найти тайм-аут или у меня его нет на моем Mac
Hk148
@ Hk148: Да, после того, как NuTTyX выяснил, что ваша версия bash слишком старая, чтобы поддерживать его первый ответ, я боялся, что в OS X это тоже будет не хватать.
G-Man