我正在运行一个需要使用 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