我正在 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