2011-05-25 49 views
2

我一直试图在一夜之间运行我的java程序,但我需要重新启动它有时保存它的进度,并完全重新启动机器。几个小时后,我让程序保存它的进度并执行一个小重启文件来重启程序。如何成功杀死一个java进程并在unix中重启它?

void restartServer() { 
    try { 
     Runtime rt = Runtime.getRuntime(); 
     rt.exec("./restart.bat"); 
    } catch (java.io.IOException err) { 
     logError(err.getMessage()); 
    } 
} 

里面restart.bat我:

echo Restarting Server 
killall -9 java 
sleep 2; 
nohup java -Xmx200m -classpath bin server.Main; 

但是它不工作。它说:

[[email protected] java]# ./restart.bat 
Restarting Server 
: no process killed 
: command not found 3: 
nohup: appending output to `nohup.out' 
: command not found 4: 
[[email protected] java]# 

为什么说java进程运行时没有进程死掉?为什么它没有找到命令?它从不重新启动程序。

+3

在管理启动新的java进程之前,这可能不会自杀吗? – jontro 2011-05-25 21:34:18

+0

@Bengt好点。我认为可能会发生。 – bacchus 2011-05-25 21:38:17

+0

糟糕。我忘了在killall之前睡一觉。这应该解决它我认为。 – Kyle 2011-05-25 21:42:05

回答

1

如何把#!/bin/sh或类似的东西作为第一线的restart.bat

BTW,.bat是推广Linux系统上的一个非常糟糕的选择。

+0

是一个更好的扩展? – Kyle 2011-05-25 21:34:52

+0

@凯尔。如果你在Linux上,是的。 – 2011-05-25 21:36:44

+0

亚历克斯这样做了,谢谢:)在开始工作之前,我必须在脚本上运行dos2unix。但它的工作! – Kyle 2011-05-25 21:41:05

1

对于你的JVM而言,它会像中间过程一样被杀死吗?如果没有,您可以考虑使用JMX bean来检查程序状态并从JVM内部进行关闭。

+0

那么在执行restartServer()之前的程序中void我也执行了saveProgress()void。我从来没有想过要从JVM内部关闭。我想我可以调用关机程序,然后在睡眠好之后执行程序10-15秒,那应该有足够的时间关机了? – Kyle 2011-05-25 21:37:51

1

而是开始从服务器本身的应用程序,你可以做一个这样的脚本:

#!/bin/sh 
while [ 1 ] 
do 
    nohup java -Xmx200m -classpath bin server.Main; 
done 

一旦退出这将重新启动该进程。在您的投资者退出后,它会自动重启。

+0

所以如果我执行这个脚本在后台运行,我可以退出JVM,这会重新启动它? – Kyle 2011-05-25 22:14:44

+1

是的,它应该这样做 – jontro 2011-05-25 22:20:37