视频服务器(13) Kurento[8] Shell守护进程

目录

一、shell相关知识点学习

二、守护进程脚本:kms.sh

三、加上websocket连接测试

四、加上netstat测试


目的:写一个shell脚本 作为守护进程 判断一个服务的状态 服务出问题则重启。

具体场景:在测试过程中发现kms服务会出问题,导致视频播放出问题,重启一下kms服务就好了。弄个守护进程。因为是服务,需要sudo,java执行shell指令不行,考虑直接用写个shell脚本,用sudo运行,作为守护进程。

 

一、shell相关知识点学习

基本教程:Ubuntu构建一个简单基本脚本

for:shell脚本----for循环

    解决问题 Syntax error: Bad for loop variable

while:Linux Shell脚本编程while语句案例

将命令结果赋予变量:https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/

字符串操作:

    linux shell 字符串操作(长度,查找,替换)详解

    【转载】Shell判断字符串包含关系的几种方法

    shell 使用指定的分割符来分割字符串

if判断:Linux篇:shell脚本中if的“-e,-d,-f”

等待:linux shell脚本中的延时

时间格式:Linux下date命令,格式化输出,时间设置 shell命令date获取时间精确到毫秒

创建函数:shell脚本--函数

 

二、守护进程脚本:kms.sh

#! /bin/bash
function getDate(){
	echo '['$(date "+%H:%M:%S.%N")']'
}
function getKmsStatus(){
	kms_s1=$(service --status-all | grep kurento)
	status=${kms_s1:3:1}
	echo $status
}
echo begin
while true; do
	echo $(getDate)'start' 
	status=$(getKmsStatus)
	echo $(getDate)'end' 
	echo 's:'$status
	if [ $status = "+" ]; then
	 echo 'running'
	 #service kurento-media-server stop
	else
	 echo 'stoped restart'
	 service kurento-media-server restart
	fi
	echo
	sleep 5
done
echo end

使用:sudo sh kms.sh

-----------------------------------------------------------------------------------------------

三、加上websocket连接测试

测试过程中出现一种情况,kms服务处于运行状态,但是java写的视频服务端无法连接上kms。

[KurentoClient]  Error sending heartbeat to server. Exception: [KurentoClient]  Exception connecting to WebSocket server ws://127.0.0.1:8888/kurento

单独写一个java程序,做连接测试,结合前面的shell脚本,增强守护进程的能力。

1.用idea写个单独的命令行程序,打包成jar包,用shell调用

参考:idea打包java可执行jar包

java代码

public class Main {

    public static void main(String[] args) {
	// write your code here
        System.out.println("a");
        System.out.println("b");
        System.out.println("hello112");
    }
}

jar.sh

#! /bin/bash
result1=$(java -jar websocketClientTest.jar)
echo 'r:'$result1

运行:sh jar.sh

结果:

r:a b hello112

结论:可以

2.修改命令行程序,增加websocket连接功能。

参考:Java实现Websocket客户端

下载websocket的jar包,https://www.mvnjar.com/org.java-websocket/Java-WebSocket/1.3.8/detail.html

导入项目,代码运行没问题。

打包成jar后,运行提示,

错误:无法初始化主类 com.compay.Main

原因:java.lang.NoClassDefFoundError:org/java_websocket/drafts/Draft

应该是打包没有把引用的jar包放进去的原因,放其实放进去了的,无法引用到。

发现原因是出在我是在前面的测试的项目的基础上添加的,重新创建一个Artifacts并打包就好了。

3.具体连接kms,连接失败则重启。

Java代码

package com.company;
import org.java_websocket.WebSocket;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft_6455;
import org.java_websocket.handshake.ServerHandshake;

import java.net.URI;
import java.net.URISyntaxException;

public class Main {
public static WebSocketClient client;
    public static int conState=0;
    public static void main(String[] args) throws InterruptedException {
        //System.out.println("args:"+args);
        //System.out.println("length:"+args.length);
        String url="ws://121.40.165.18:8800";//测试用 可以连 => [state:OPEN]
        url="ws://121.40.165.18:8888";//测试用 不能连 连接超市 => [state:NOT_YET_CONNECTED]
        //url="ws://127.0.0.1:8888/kurento";//kms => [state:CLOSED]
        if(args.length>0){
            url=args[0];
        }
        System.out.println("url:"+url);
        try {
            client = new WebSocketClient(new URI(url),new Draft_6455()) {
                @Override
                public void onOpen(ServerHandshake serverHandshake) {
                    System.out.println("握手成功");
                    conState=1;
                }

                @Override
                public void onMessage(String msg) {
                    System.out.println("收到消息=========="+msg);
                    if(msg.equals("over")){
                        client.close();
                    }
                    conState=2;
                }

                @Override
                public void onClose(int i, String s, boolean b) {
                    System.out.println("链接已关闭:"+s);
                    conState=-1;
                }

                @Override
                public void onError(Exception e){
                    //e.printStackTrace();
                    System.out.println("发生错误已关闭:"+e);
                    conState=-1;
                }
            };
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

        client.connect();
        System.out.println(client.getDraft());
        int count=0;
        //boolean
        while(!client.getReadyState().equals(WebSocket.READYSTATE.OPEN)){
            if(conState<0){
                break;
            }
            count++;
            //System.out.println("["+count+"]正在连接...["+conState+"]");
            System.out.println("正在连接...");
            Thread.sleep(10);
            if(count>10){//20×60=1.2s
                break;
            }
        }
        WebSocket.READYSTATE state=client.getReadyState();
        //连接成功,发送信息
        if(client.getReadyState().equals(WebSocket.READYSTATE.OPEN)){
            client.send("哈喽,连接一下啊");
        }
        else{
            client.closeConnection(1,"TimeOut");
            client.closeBlocking();
            System.out.println("连接失败");

        }
        System.out.println("[state:"+state+"]");
        System.exit(0);
    }
}

新的kms.sh脚本

#! /bin/bash
function getDate(){
	echo '['$(date "+%H:%M:%S.%N")']'
}
function getKmsStatus(){
	kms_s1=$(service --status-all | grep kurento)
	status=${kms_s1:3:1}
	echo $status
}
echo begin
while true; do
	echo $(getDate)'start' 
	status=$(getKmsStatus)
	echo $(getDate)'end' 
	echo 's:'$status
	if [ $status = "+" ]; then
	 echo 'running'
	 #service kurento-media-server stop
	ws=$(java -jar websocketClientTest.jar ws://127.0.0.1:8888/kurento)
	#echo 'ws:'$ws
	strB="拒绝连接"
	strC="CLOSED"
	if [[ $ws =~ $strB ]] || [[ $ws =~ $strC ]]
	then
		echo "无法连接 重启"
		service kurento-media-server restart
	else
		echo "可以连接"
	fi
	else
	 echo 'stoped restart'
	 service kurento-media-server restart
	fi
	echo
	sleep 5
done
echo end

四、加上netstat测试

获取连接kurento的端口数量

function getConnectCount(){
    nets1=$(sudo netstat -tupln | grep -e :8888)
    nets2=$(sudo netstat -tupln | grep -e kurento)
    abc=$nets2
    array=(${abc//,/ })
    i=0;
    str1="tcp"
    str2="udp"
    j=0;
    for var in ${array[@]}
    do
            if [[ $var =~ $str1 ]] || [[ $var =~ $str2 ]]
            then
                j=$[$j + 1]
            fi
        #echo $i":"$var
        #i=$[$i + 1]
    done
     j=$[$j - 1]
    echo $j
}

获取kms的id

function getKmsId(){
    nets1=$(sudo netstat -tupln | grep -e :8888)
    abc=$nets1
    array=(${abc//,/ })
    abc2=${array[6]}
    array2=(${abc2//// })
    id=${array2[0]}
    echo $id
}

加到重启判断中

	ws=$(java -jar websocketClientTest.jar ws://127.0.0.1:8888/kurento)
	#echo 'ws:'$ws
	strB="拒绝连接"
	strC="CLOSED"
	strD="NOT_YET_CONNECTED"
            if [[ $ws =~ $strB ]] || [[ $ws =~ $strC ]] || [[ $ws =~ $strD ]]
		then
			connectCount=0
			disConnectCount=$[$disConnectCount+1]
			echo "无法连接 重启 "$disConnectCount

			count=$(getConnectCount)
			echo "count:"$count
			id=$(getKmsId)
			echo "id:"$id
			 if [[ $count -gt 0 ]]  #明明websocket无法连接上,但是有端口占用,kill进场
                            then
				sudo kill -9 $id
                            fi
			service kurento-media-server restart
		else
			disConnectCount=0
			connectCount=$[$connectCount+1]
			echo -e  "可以连接 "$connectCount

			count=$(getConnectCount)
			echo "端口连接数量:"$count
			count2=$(echo "$count/32"|bc)#不一定是32,播放视频是32,连接监控是34
			echo "客户端数量:"$count2
			id=$(getKmsId)
			echo "id:"$id
		fi

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章