JAVA重啟自身程式
阿新 • • 發佈:2019-01-08
,在使用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();
}