視頻服務器(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

 

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