在 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

相关内容