1. 程式人生 > >JAVA重啟自身程式

JAVA重啟自身程式

,在使用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(); }