监听服务器中某个项目是否挂了

2019-09-28  本文已影响0人  仰望星空_4645

1、服务器是linux,通过类似xshell访问服务器然后命令查看项目进程是否启动
2、ShellUtils工具类如下

import com.jcraft.jsch.*;

import java.io.*;

public class ShellUtils {
    /**
     * 创建session
     * @param host 主机名称/ip地址
     * @param user 登陆用户名
     * @param psw  密码
     * @param port 端口
     * @return
     */
    public static Session getSession(String host, String user, String psw, int port){
        JSch jsch=new JSch();
        Session session=null;
        try {
            session = jsch.getSession(user, host, port);
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            session.setPassword(psw);
            session.connect();
        } catch (JSchException e) {
            System.out.println("连接linux主机失败");
            e.printStackTrace();
        }
        return session;

    }
    /**
     * 得到可以执行命令的连接
     * @param session 连接session
     * @return 可以执行命令的ChannelExec
     */
    public static ChannelExec getChanel(Session session){
        ChannelExec openChannel=null;
        try {
            if(null !=session){
                openChannel = (ChannelExec) session.openChannel("exec");
            }
        } catch (JSchException e) {
            e.printStackTrace();
        }
        return openChannel;
    }
    /**
     *
     * @param openChannel
     * @param command
     * @return
     */
    public static String getExcRes(ChannelExec openChannel,String command){
        InputStream in =null;
        BufferedReader reader=null;
        StringBuffer result=new StringBuffer();
        try {
            try {
                openChannel.setCommand(command);
                int exitStatus = openChannel.getExitStatus();
                System.out.println(exitStatus);
                openChannel.connect();
                in = openChannel.getInputStream();
                reader = new BufferedReader(new InputStreamReader(in));
                String buf = null;
                while ((buf = reader.readLine()) != null) {
                    result.append(new String(buf.getBytes("gbk"),"UTF-8")+"<br>\r\n");
                }
//reader.close();
            } catch (JSchException e) {
                result.append(e.getMessage());
                e.printStackTrace();
            }
        } catch (IOException e) {
            result.append(e.getMessage());
            e.printStackTrace();
        } /*finally {
//try {
//reader.close();
//} catch (IOException e) {
//e.printStackTrace();
//}
        }*/
        return result.toString();

    }

    public static ChannelShell ChannelShell(Session session) {
        ChannelShell channel = null;
        try {
            if (null != session) {
                channel = (ChannelShell) session.openChannel("shell");
                channel.connect();
            }
        } catch (JSchException e) {
            e.printStackTrace();
        }
        return channel;
    }


    public  static String executeNewFlow(ChannelShell channel, String command) {
        InputStream in =null;
        OutputStream out=null;
        String  msg=null;
        BufferedReader reader=null;
        StringBuffer result=new StringBuffer();
        try {
            in  =  channel.getInputStream();
            out =  channel.getOutputStream();
            out.write(command.getBytes());
            out.flush();
//            reader = new BufferedReader(new InputStreamReader(in));
//            while ((msg =reader.readLine()) !=null ){
//                System.out.println(msg);
//            }
            byte[] tmp=new byte[1024];
            while (true){
                int i=0;
                //线程等待 200ms
                Thread.currentThread().sleep(200);
                while(in.available()>0){
                    i=in.read(tmp, 0, 1024);
                    if(i<0)break;
                }
                System.out.print("------------"+new String(tmp, 0, i));
                return new String(tmp, 0, i);
//                if(channel.isClosed()){
//                    if(in.available()>0) continue;
//                    System.out.println("exit-status: "+channel.getExitStatus());
//                    break;
//                }
            }
        }catch (Exception e){
            result.append(e.getMessage());
            e.printStackTrace();
        }

        return null;
    }

    public static void disConnect(Session session,ChannelExec openChannel){
        if(session!=null&&!openChannel.isClosed()){
            openChannel.disconnect();
        }
        if(session!=null&&session.isConnected()){
            session.disconnect();
        }
    }
}

Test测试类

import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.Session;
import okhttp3.*;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class Test {
    private String ip = "101.201.140.161";//服务器ip
    private int port=29xxx;//端口号
    private String user="xxx";//服务器账号
    private String pwd="xxx";//服务器密码
    private String weixin_jiqi="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=48590c4";//企业微信通知机器
    private String comm="ps -ef|grep axxo;";//查看服务的进程

    @org.testng.annotations.Test
    public void test1(){
        Session session1=ShellUtils.getSession(ip, user, pwd, port);
        ChannelExec chanel=ShellUtils.getChanel(session1);
        String ss=ShellUtils.getExcRes(chanel, comm);
        System.out.println(ss);
        if(ss!=null&&ss.length()>0&&ss.contains("Djava.awt.headless")){
            System.out.println("服务启动中");
//            sendMessage("axxol服务启动中",weixin_jiqi);
        }else{
            System.out.println("服务失败");
            sendMessage("axxol服务挂了",weixin_jiqi);

        }
    }
    /**
     *
     * @param message  消息体内容
     * @param url 机器人的url
     */
    private void sendMessage(String message,String url){
        String reqBody ="{" +
                "    \"touser\":\"12345\"," +
                "    \"msgtype\":\"text\"," +
                "    \"agentid\":1," +
                "    \"text\":{" +
                "        \"content\":\"" +message+
                " \"safe\":1" +
                "}";

        OkHttpClient client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS)// 设置连接超时时间
                .readTimeout(20, TimeUnit.SECONDS)// 设置读取超时时间
                .build();
        MediaType contentType = MediaType.parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(contentType, reqBody);
        Request request = new Request.Builder().url(url).post(body).addHeader("cache-control", "no-cache").build();
        Response response = null;
        try {
            response = client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println();
        }
    }

}

pom.xml需要加入依赖插件

  <dependency>
      <groupId>com.jcraft</groupId>
      <artifactId>jsch</artifactId>
      <version>0.1.54</version>

    </dependency>
    <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>okhttp</artifactId>
      <version>3.3.0</version>
    </dependency>

3、通过jenkins定时轮询:H/5 9-19 * * *,从9点到19点每隔5分钟轮询一次

效果如下 image.png
上一篇下一篇

猜你喜欢

热点阅读