Wie kann eine laufende JAR-Datei in einem Bash-Skript nach 5 Minuten angehalten und die nächste gestartet werden?

2185
Hk148

Ich muss eine JAR-Datei mit anderen Parametern 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 der zweite mehr als fünf Minuten gedauert hat, möchte ich ihn stoppen und mit dem nächsten fortfahren. Daher beträgt die maximale Zeit für jedes laufende Glas 5 Minuten. Wenn es weniger braucht, ist das in Ordnung. Wenn jedoch einer länger läuft, muss das Skript mit dem nächsten fortfahren.

1
(1) Wenn Sie * spezifisch * nach einem Java-Programm fragen, das Sie ändern können, besteht eine Möglichkeit darin, das Zeitlimit in den Java-Code zu integrieren. (2) Warum sagen Sie "echo $ (...)", anstatt das Programm einfach mit "java -jar IPM.jar ... sign.txt" auszuführen? G-Man vor 10 Jahren 0
Für das `echo $` haben Sie recht und ich habe das getan, bevor es sich nur um eine Kopie des Codes handelt, den ich hier geputtet habe. Was den Java-Code angeht, weiß ich nicht, wie ich das programmgesteuert machen soll. Ich habe `System.CurrentTimeMilles` ausprobiert, aber es funktioniert nicht. Hk148 vor 10 Jahren 0

2 Antworten auf die Frage

1
NuTTyX

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 der Suche ein wenig für eine reine Java - Version fand ich diese :

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); 
Danke für die Antwort. Es läuft immer noch der Prozess nach den 5 Minuten. `kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... oder kill -l [sigspec] `. Es gibt mir diese Zeile, nachdem jeder Vorgang mehr als 5 Minuten dauert. und es läuft immer noch was ich nicht will. Hk148 vor 10 Jahren 0
@ Hk148: Ich habe das in einem etwas künstlichen Test zum Laufen gebracht. (Ich habe eine "kill: (1234) - Keine solche Prozess" -Meldung für jeden Aufruf erhalten, der vor Ablauf der Zeit beendet wurde.) Sind Sie sicher, dass Sie ihn richtig eingeben? (Versuchen Sie es mit Kopieren und Einfügen.) Welches Betriebssystem verwenden Sie? G-Man vor 10 Jahren 0
Dieses Verfahren hat den Nachteil, dass die Ausgaben "Kill-Prozess" und "Kein solcher Prozess" ausgegeben werden. Ich habe versucht, es mit einem `2> & 1> / dev / null` nach dem Kill-Befehl auszuführen, aber die Ausgabe wurde nicht ausgelassen. Aus Gründen der Klarheit habe ich dies in der Lösung weggelassen. Ich habe es auf cygwin getestet, nicht auf einer echten Unix-Shell, aber die Argumente für Befehle wie "kill" sollten die gleichen sein wie die meisten Linux-Boxen NuTTyX vor 10 Jahren 0
@ G-Man Ich benutze Mac OSX, aber das Problem ist nach den 5 Minuten nicht, dass der nächste Test oder die nächste Zeile nicht gestartet wird. Nach 5 Minuten stoppt es einfach alles. Hk148 vor 10 Jahren 0
@NuTTyX Gibt es andere Möglichkeiten, dies im Java-Code zu tun? Hk148 vor 10 Jahren 0
Scheint, als hätte Mac OS X bash 3.2, so funktioniert meine erste Lösung nicht. Ich habe eine neue hinzugefügt. Versuch es. NuTTyX vor 10 Jahren 0
Nur eine Warnung: Unter den richtigen Bedingungen könnte diese Lösung den falschen Prozess töten. Wenn der zu beendende Prozess beendet wurde, könnte seine PID einem anderen Prozess zugewiesen werden. Und einige Unix-y-Systeme weisen PIDs zufällig zu, sodass eine PID früher als erwartet recycelt werden kann. Kenster vor 10 Jahren 0
@Kenster ist wahr, aber für nicht sehr ausgelastete Server unwahrscheinlich und innerhalb dieses 5-Minuten-Timeouts. Sehr hässlich, da die Ausgabe jedes Mal "kill" gedruckt wird. Am einfachsten ist jedoch, dass Sie den Java-Code nicht bearbeiten müssen und auf gängige Befehle angewiesen sind. Ich habe eine neue Lösung hinzugefügt, die sauberer und sicherer sein sollte. NuTTyX vor 10 Jahren 0
1
G-Man

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

timeout 300s java -jar IPM.jar 0 20 3 sign.txt ︙ 
`man Timeout` oder` info coreutils 'Timeout Invocation``, um eine vollständige Hilfe zu erhalten. Es ist ein Teil von _GNU coreutils_. Hastur vor 10 Jahren 0
@ G-Man Wenn ich es versuche, heißt es: "Timeout: Befehl nicht gefunden". Ich denke, diese Version kann das Timeout nicht finden oder ich habe es nicht auf meinem Mac Hk148 vor 10 Jahren 0
@ Hk148: Ja, nachdem NuTTyX herausgefunden hatte, dass Ihre Version von bash zu alt war, um seine erste Antwort zu stützen, hatte ich Angst, dass OS X dies auch vermissen würde. G-Man vor 10 Jahren 0