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进程存在输出: