TSINGSEE青犀视频开发的RTSP协议视频智能分析平台EasyNVR是目前市面上比较完善且稳定的视频流媒体直播分发平台。EasyNVR内接入的视频通道都可以通过平台进行网页直播,并且支持市面上大部分的RTSP/Onvif协议设备:IP Camera/NVR/DVR/编码器等。
当我们测试的时候,有时会出现EasyNVR通道在线,也能够正常生成快照,并且其他功能都是正常的,但是视频无法播放的情况。
由于其他功能正常,所以我们查看logs文件下的log日志也无法检查出原因,说明EasyNVR本身运行都很正常。
随后我们发现nginx的进程不存在了,观察日志发现到某一时间,就不打印了,这个停止打印的时间,应该就是nginx正常运行的最后时间,停止打印后,nginx进程就停止了。
发现问题所在后,我们就在EasyNVR添加了定时任务,定时去监听nginx的进程是否存在,如果不存在就重新启动nginx,以此来避免此类问题的出现。
在EasyNVR上实现该功能之前先通过以下代码实现的小工具进行分析。
func main() {
var inputStr string
for {
fmt.Println("---------------------------------------------------")
fmt.Print("1->退出 ")
fmt.Print("2->显示进程 ")
fmt.Print("3->结束进程 ")
fmt.Println("4->显示全部进程")
fmt.Println("---------------------------------------------------")
fmt.Scanln(&inputStr)
if inputStr == "1" {
fmt.Println("已退出...")
break
} else if inputStr == "2" {
fmt.Print("请输入进程名称:")
var processName string
fmt.Scanln(&processName)
if len(processName) == 0 {
fmt.Println("进程名称不可为空!")
} else {
text := "imagename eq " + processName + "*"
listProcess(text)
}
} else if inputStr == "3" {
fmt.Print("请输入要结束的进程名称:")
var processName string
fmt.Scanln(&processName)
if len(processName) == 0 {
fmt.Println("进程名称不可为空!")
} else {
text := "imagename eq " + processName + "*"
killProcess(text)
}
} else if inputStr == "4" {
listAllProcess()
} else {
fmt.Println("请输入正确的参数!")
}
}
fmt.Scanln(&inputStr)
}
func listProcess(text string) {
fmt.Println(text)
cmd := exec.Command("tasklist", "/fi", text)
out, err := cmd.CombinedOutput()
if err != nil {
log.Fatal(err)
}
fmt.Println(string(out))
}
func listAllProcess() {
cmd := exec.Command("tasklist")
out, err := cmd.CombinedOutput()
if err != nil {
log.Fatal(err)
}
fmt.Println(string(out))
}
func killProcess(text string) {
cmd := exec.Command("taskkill", "/f", "/t", "/fi", text)
out, err := cmd.CombinedOutput()
if err != nil {
log.Fatal(err)
}
fmt.Println(string(out))
}
Windows下可以通过该方法查询nginx进程是否存在:
nginx进程不存在输出:
nginx进程存在输出: