• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

JAVA重启自身程序

java 来源:yushi6310 5次浏览

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

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)