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();
    }
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值