如果我的java程序被杀了,如何自动重新启动它?

如果我的java程序被杀了,如何自动重新启动它?

我正在 Linux 机器(machineA)中运行我的可运行 jar,如下所示。在可运行的 Jar 中,我有一个 java 程序,它每 15 分钟向我发送一次电子邮件。

/usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/java -jar abc.jar config.properties &

一旦我开始abc.jar像上面这样,它就会在后台运行,并且有一个类将继续每 15 分钟向我发送电子邮件。我在我的 java 程序中使用 Scheduler,它是一个每 15 分钟唤醒一次并向我发送电子邮件的线程。

现在一切正常。假设machineA由于某种原因重新启动或abc.jar由于某种原因被杀死,那么我正在寻找一种方法,以便我abc.jar在后台自动再次启动。

所以我决定使用 Ubunutu 中的 upstart 功能,因为我运行的是 Ubuntu 12.04 - 这是我的配置文件 -

#/etc/init/testlnp.conf

#sudo start testlnp
#sudo stop testlnp

start on runlevel [2345]
stop on runlevel [016]

chdir /export/home/david/tester
respawn

post-stop script
  sleep 30
end script

limit nofile 8092 8092
setuid david
exec /usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/java -jar abc.jar config.properties &

我的abc.jar文件在这个目录中/export/home/david/tester。现在我像这样启动了我的java程序一次 -

sudo start testlnp

一切开始都很好,我可以看穿ps aux | grep java-

david@machineA:~$ ps aux | grep java
david 130691 38.5  0.0 33906208 58636 ?      Sl   19:24   0:01 /usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/java -jar abc.jar config.properties
david   131029  0.0  0.0   8100   936 pts/2    S+   19:24   0:00 grep --color=auto java

现在过了一段时间,我ps aux | grep java又做了一次,我看到了这样的结果 - 这意味着我的abc.jar程序有多个实例?这是我无法理解为什么会发生?

david@slc4b03c-8ixd:~$ ps aux | grep java
david   1746  4.5  0.0 33906208 57808 ?      Sl   19:25   0:01 /usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/java -jar abc.jar config.properties
david   2143 73.0  0.0 33906208 57992 ?      Sl   19:25   0:01 /usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/java -jar abc.jar config.properties
david     2180  0.0  0.0   8100   936 pts/2    S+   19:25   0:00 grep --color=auto java
david 130691  2.5  0.0 33906208 57492 ?      Sl   19:24   0:01 /usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/java -jar abc.jar config.properties

我的主要目标是,如果我的机器重新启动或 abc.jar 由于某种原因被杀死,请再次重新启动 abc.jar?我该如何实现这一目标?我和暴发户做错了什么吗?

更新:-

这就是我得到的 PPID -

david@machineA:~$ ps aux | grep java
david  18454  4.5  0.0 33906208 57520 ?      Sl   20:01   0:01 /usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/java -jar abc.jar config.properties
david  18692 27.3  0.0 33906208 57788 ?      Sl   20:01   0:01 /usr/lib/jvm/java-1.7.0-openjdk-amd64/bin/java -jar abc.jar config.properties
david    18779  0.0  0.0   8096   940 pts/2    S+   20:02   0:00 grep --color=auto java


david@machineA:~$ ps  xao pid,ppid,pgid,sid,comm | grep java
 18454      1  18453  18453 java
 18692      1  18691  18691 java

答案1

摆脱&.这使得它进入后台,Upstart 认为该进程已死亡,然后生成一个新进程。只需要没有 & 符号的 exec 行即可。

答案2

crontab -e,然后添加以下项目

* * * * * a=`ps aux | grep abc.jar | grep -v grep | wc -l`; test $a -eq 0 && java -j /path/to/abc.jar

答案3

另请参阅 daemontools(不是虚拟 CD 装载软件):https://cr.yp.to/daemontools.html

相关内容