,在使用java编写重启自身的程序时,本以为很简单,但是发现没有那么顺利
一般程序重启方法:service xxxx restart
但java程序执行这个操作时,发现整个程序只能stop, 不能start
解决思路:
当时想的是,使用后台命令执行service xxxx restart命令,如使用 nohup, setsid等方法,
经过测试发现,并没有那么顺利,使用Runtime.getRuntime().addShutdownHook()方法也不怎么好使
后面就写了一个稍微麻烦的方法来解决这个问题
当接收到重启命令时,创建一个新的进程,这个进程用来检测java程序运行状态,然后关闭service服务。
String stopCommond = "setsid service xxxx stop" ;
// 创建一个线程,用来启动检测的进程
new Thread(new Runnable() {
@Override
public void run() {
//后台启动检查程序巡行状态的进程
String listenter = "nohup java -cp /opt/csic/jar/util.procadm.jar at.csic.util.procadm.RestartSelfListener &";
NodeManagementUtils.execCommand(listenter);
}
}).start();
Thread.sleep(1000);
NodeManagementUtils.execCommand(stopCommond);
RestartSelfListener 类
public class RestartSelfListener {
private static Properties properties;
public RestartSelfListener() {
final String restartCmd = "service xxxx start";
new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while (i < 60) {
i++;
//检测service服务是否存在,当结果为0时,不存在
String checkCmd = "jps -l |grep ProcessControlServer|wc -l";
String result = RestartSelfListener.execCommand(checkCmd);
//结果为0,service服务停掉,启动程序
if ("0".equals(result)) {
RestartSelfListener.execCommand(restartCmd);
break;
}
try {
// 5 秒钟检测一下服务的状态
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
public static String execCommand(String cmd) {
StringBuffer sb = new StringBuffer();
BufferedReader in = null;
try {
Runtime rt = Runtime.getRuntime();
String[] cmdA = { "/bin/sh", "-c", cmd };
Process p = rt.exec(cmdA);
in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String str = null;
while ((str = in.readLine()) != null) {
sb.append(str);
}
if (null != in) {
in.close();
}
} catch (IOException e) {
}
return sb.toString();
}
public static void main(String[] args) {
new RestartSelfListener();
}