我正在運行一個需要使用 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,因此您可能有一個名為dos2unix
available 的軟體包。如果您安裝它,則非常簡單:
dos2unix myfile