目录
目的:写一个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