web-dev-qa-db-ja.com

Javaプログラムが強制終了された場合、自動的に再起動する方法は?

以下に示すように、実行可能なjarをLinuxマシン(machineA)で実行しています。実行可能なJarには、15分ごとに電子メールを送信するJavaプログラムがあります。

/usr/lib/jvm/Java-1.7.0-openjdk-AMD64/bin/Java -jar abc.jar config.properties &

上記のようにabc.jarを開始するとすぐに、バックグラウンドで実行され、15分ごとにメールを送信し続けるクラスがあります。 Javaプログラムでスケジューラを使用しています。このプログラムは、15分ごとに起動し、メールを送信するスレッドです。

これで、すべてが正常に機能しています。 machineAが何らかの理由で再起動された、またはabc.jarが何らかの理由で強制終了されたとすると、abc.jarがバックグラウンドで自動的に再開される方法を探しています。

そこで、Ubuntu 12.04を実行しているので、Ubunutuでupstart機能を使用することにしました-そしてこれが私の設定ファイルです-

#/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を再起動することです。どうすればこれを達成できますか? upstartで何か問題がありますか?

更新:-

これは私が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
arsenal

&を取り除きます。これにより、バックグラウンドに分岐し、Upstartはプロセスが終了したと見なし、新しいプロセスを生成します。アンパサンドなしのexec行があります。

3
CameronNemo

crontab -e、次の項目を追加します

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

デーモンツール(仮想CDマウントソフトウェアではない)も参照してください: https://cr.yp.to/daemontools.html

0
flow2k