目錄
目的:寫一個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 字符串操作(長度,查找,替換)詳解,
if判斷:Linux篇:shell腳本中if的“-e,-d,-f”
時間格式: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調用
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連接功能。
下載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