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 od
folgenden 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 nl
in der Ausgabe t r u e
beispielsweise 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 sleep
Ihrem Skript einen Befehl wie den folgenden hinzufügen:
while true
do
java -jar program.jar
sleep 1
done
Bei einem program.jar
sofortigen 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 dos2unix
available zur Verfügung. Wenn Sie es installieren, ist es ganz einfach:
dos2unix myfile