Как в Debian создать скрипт, который перезапустит программу Java после ее остановки или сбоя?

Как в Debian создать скрипт, который перезапустит программу Java после ее остановки или сбоя?

Я запускаю программу сервера Java, которую нужно запустить с помощью скрипта оболочки. Скрипт должен снова запустить программу Java, если она зависнет или будет остановлена ​​вручную.

Я нашел этот скрипт в сети

while true
do
   java -jar program.jar
done

Но это, похоже, не сработало на моем компьютере с Debian 7; он просто показывает:

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

Это было только что опубликовано как скрипт "Linux". Как мне заставить его работать в Debian? Ах да, и важно, чтобы программа запускалась из скрипта, потому что мне нужно регулярно получать доступ к его консоли, если только нет способа сделать так, чтобы он не был скриптом, но все равно позволял мне получать доступ к его консоли.

решение1

Это совершенно допустимый сценарий. Он будет работать где угодно. Если вы получаете синтаксическую ошибку, это потому, что либо была допущена синтаксическая ошибка при копировании/вставке сценария, либо, как предположил Томас в комментариях, ваш файл использует неправильные разделители строк.

Проверить ограничители строк можно с помощью odследующей команды:

$ 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

Вы можете видеть здесь, что скрипт в моей системе использует новые строки (это nlв выводе, сразу после, t r u eнапример). Если вместо этого вы видите только возвраты каретки:

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

Или комбинации возврата каретки/новой строки:

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

Тогда вам придется это исправить.

Как только все заработает, вы, возможно, захотите добавить sleepв свой скрипт команду, например, такую:

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

В случае, если program.jarпроисходит сбой немедленно, плотный цикл без пауз может потреблять много ресурсов ЦП. Введение небольшой паузы в значительной степени решает эту конкретную проблему.

решение2

Ответ larsks' хорошо написан и обширен. Соответственно, был поставлен плюс.

Небольшая заметка:

Тогда вам придется это исправить.

Существует множество способов конвертировать Windows CR в Linux/Unix LF. Вот несколько из них:
Использование tr:

tr -d '\r' < infile > outfile

С использованием sed:

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

Наконец, поскольку вы используете Debian, у вас может быть пакет dos2unixavailable. Если вы его установите, это будет просто:

dos2unix myfile

Связанный контент