在 Debian 上,如何製作一個腳本來在 Java 程式停止或崩潰後重新運行它?

在 Debian 上,如何製作一個腳本來在 Java 程式停止或崩潰後重新運行它?

我正在運行一個需要使用 shell 腳本啟動的 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立即崩潰,沒有暫停的緊密循環可能會消耗大量 CPU。引入一個小停頓在很大程度上解決了這個特殊的問題。

答案2

拉斯克斯的回答寫得很好而且內容廣泛。已相應投贊成票。

簡單說明一下:

然後你需要解決這個問題。

有多種方法可以將 Windows CR 轉換為 Linux/Unix LF。以下是一些:
使用tr

tr -d '\r' < infile > outfile

使用sed

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

最後,由於您使用的是 Debian,因此您可能有一個名為dos2unixavailable 的軟體包。如果您安裝它,則非常簡單:

dos2unix myfile

相關內容