Wie erstelle ich unter Debian ein Skript, das ein Java-Programm erneut ausführt, nachdem es angehalten oder abgestürzt ist?

Wie erstelle ich unter Debian ein Skript, das ein Java-Programm erneut ausführt, nachdem es angehalten oder abgestürzt ist?

Ich führe ein Java-Serverprogramm aus, das mit einem Shell-Skript gestartet werden muss. Das Skript muss das Java-Programm erneut starten, wenn es abstürzt oder manuell gestoppt wird.

Ich habe dieses Skript online dafür gefunden

while true
do
   java -jar program.jar
done

Aber das schien auf meiner Debian 7-Box nicht zu funktionieren. Es wird nur Folgendes angezeigt:

./start.sh: line 4: syntax error: unexpected end of file

Das wurde gerade als „Linux“-Skript gepostet. Wie kann ich es unter Debian zum Laufen bringen? Ach ja, und es ist wichtig, dass das Programm vom Skript aus gestartet wird, weil ich regelmäßig auf seine Konsole zugreifen muss, es sei denn, es gibt eine Möglichkeit, dass es kein Skript ist, ich aber trotzdem auf seine Konsole zugreifen kann.

Antwort1

Das ist ein vollkommen gültiges Skript. Es würde überall einwandfrei funktionieren. Wenn Sie einen Syntaxfehler erhalten, liegt das entweder daran, dass beim Kopieren/Einfügen des Skripts ein Syntaxfehler aufgetreten ist, oder daran, dass Ihre Datei, wie Thomas in den Kommentaren vermutet, falsche Zeilenabschlüsse verwendet.

Sie können Zeilenabschlusszeichen mit dem odfolgenden Befehl überprüfen:

$ od -a foo.sh 
0000000   w   h   i   l   e  sp   t   r   u   e  nl   d   o  nl  sp  sp
0000020  sp   j   a   v   a  sp   -   j   a   r  sp   p   r   o   g   r
0000040   a   m   .   j   a   r  nl   d   o   n   e  nl
0000054

Sie können hier sehen, dass das Skript auf meinem System Zeilenumbrüche verwendet (das ist nlin der Ausgabe t r u ebeispielsweise direkt nach ). Wenn Sie stattdessen nur Zeilenumbrüche sehen:

0000000   w   h   i   l   e  sp   t   r   u   e  cr   d   o  cr  sp  sp

Oder Kombinationen aus Wagenrücklauf und Zeilenumbruch:

0000000   w   h   i   l   e  sp   t   r   u   e  cr  nl   d   o  cr  nl

Dann müssen Sie das beheben.

Sobald alles funktioniert, können Sie sleepIhrem Skript einen Befehl wie den folgenden hinzufügen:

while true
do
   java -jar program.jar
   sleep 1
done

Bei einem program.jarsofortigen Absturz kann die enge Schleife ohne Pausen viel CPU-Leistung verbrauchen. Das Einfügen einer kleinen Pause löst dieses Problem weitgehend.

Antwort2

Die Antwort von larsks ist sowohl gut geschrieben als auch ausführlich. Ein entsprechendes Upvote wurde gegeben.

Nur eine kurze Anmerkung zu:

Dann müssen Sie das beheben.

Es gibt unzählige Möglichkeiten, Windows CR in Linux/Unix LF zu konvertieren. Hier sind einige:
Verwenden von tr:

tr -d '\r' < infile > outfile

Verwendung von sed:

sed 's/^M$//' infile > outfile

Da Sie Debian verwenden, steht Ihnen möglicherweise ein Paket namens dos2unixavailable zur Verfügung. Wenn Sie es installieren, ist es ganz einfach:

dos2unix myfile

verwandte Informationen