監(jiān)聽服務器中某個項目是否掛了

1廓推、服務器是linux,通過類似xshell訪問服務器然后命令查看項目進程是否啟動
2翩隧、ShellUtils工具類如下

import com.jcraft.jsch.*;

import java.io.*;

public class ShellUtils {
    /**
     * 創(chuàng)建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;

    }
    /**
     * 得到可以執(zhí)行命令的連接
     * @param session 連接session
     * @return 可以執(zhí)行命令的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";//企業(yè)微信通知機器
    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  消息體內(nèi)容
     * @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
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堆生,一起剝皮案震驚了整個濱河市专缠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淑仆,老刑警劉巖涝婉,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蔗怠,居然都是意外死亡墩弯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門寞射,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渔工,“玉大人,你說我怎么就攤上這事桥温∫兀” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脓魏。 經(jīng)常有香客問我兰吟,道長,這世上最難降的妖魔是什么茂翔? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任混蔼,我火速辦了婚禮,結果婚禮上珊燎,老公的妹妹穿的比我還像新娘惭嚣。我一直安慰自己,他們只是感情好悔政,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布晚吞。 她就那樣靜靜地躺著,像睡著了一般谋国。 火紅的嫁衣襯著肌膚如雪槽地。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天芦瘾,我揣著相機與錄音捌蚊,去河邊找鬼。 笑死近弟,一個胖子當著我的面吹牛缅糟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祷愉,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼窗宦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了二鳄?” 一聲冷哼從身側響起赴涵,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎订讼,沒想到半個月后髓窜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡躯嫉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年纱烘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祈餐。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡擂啥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帆阳,到底是詐尸還是另有隱情哺壶,我是刑警寧澤屋吨,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站山宾,受9級特大地震影響至扰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜资锰,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一敢课、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绷杜,春花似錦直秆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至齿诉,卻和暖如春筝野,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粤剧。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工歇竟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俊扳。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓途蒋,卻偏偏與公主長得像猛遍,于是被迫代替她去往敵國和親馋记。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容