Debian で、Java プログラムが停止またはクラッシュした後にそのプログラムを再実行するスクリプトを作成するにはどうすればよいですか?

Debian で、Java プログラムが停止またはクラッシュした後にそのプログラムを再実行するスクリプトを作成するにはどうすればよいですか?

シェル スクリプトで起動する必要がある 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

これは完全に有効なスクリプトです。どこでも問題なく動作します。構文エラーが発生する場合は、スクリプトをコピー/貼り付けしたときに構文エラーが発生したか、Thomas がコメントで推測したように、ファイルで間違った行末文字が使用されているかのいずれかです。

次のようにコマンドを使用して行末文字を確認できます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、一時停止のないタイトなループは CPU を大量に消費する可能性があります。短い一時停止を導入すると、その特定の懸念はほぼ解決されます。

答え2

larsks の回答はよく書かれており、内容も充実しています。それに応じて賛成票を投じました。

ちょっとしたメモです:

その場合はそれを修正する必要があります。

Windows CR を Linux/Unix LF に変換する方法は無数にあります。以下にいくつか例を挙げます。
使用方法tr:

tr -d '\r' < infile > outfile

使用方法sed:

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

最後に、Debian を使用している場合は、available というパッケージが利用できる可能性がありますdos2unix。これをインストールする場合は、次のように簡単です。

dos2unix myfile

関連情報