JAVA重启自身程序

来源:互联网 发布:淘宝上有卖大便的妈 编辑:程序博客网 时间:2024/05/22 04:43

,在使用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();    }
原创粉丝点击