守护程序的指标
- 开机能启动
- 正常运行时不守护
- 手动关闭进程,守护启动
- 只有一个进程
本文以windows批处理程序(.bat)来演示守护程序,也可以使用其他方式,如Python、VB等脚本语言,当然也可以使用C/C++、C#、Java等高级语言编写守护程序,只是一般情况,脚本语言更灵活。
开机启动
windows开机启动可以通过windows计划任务实现,当然也可以通过注册表、启动程序等方式,本文以windows计划任务方式实现。
打开计算机管理 Win10计算机管理功能怎么开,依次展开计算机管理(本地) -> 任务计划程序 -> 任务计划程序库,创建任务即可,需要关注如下关键参数
- 配置系统启动触发器
- 配置周期监测触发器
服务运行监测
关于守护程序的2、3、4指标,需要在守护程序中实现,其中,需要考虑如下关键节点
- 定位服务进程,可以通过进程名称、监听端口号
- 停止服务进程,可以通过taskkill,也可以通过服务支持的其他操作,如nginx -s stop
- 启动服务进程,需要关注是否指定配置文件、启动参数,等
- 记录核心日志,便于事后排查分析总结
守护脚本模板
以TestDaemon.exe(监听8099端口)为例,守护脚本示例
::本方案需要配合windows计划任务执行,防止批处理自行定时异常退出 @echo off ::需要守护的进程名称 set _processName=TestDaemon.exe ::需要守护的进程启动命令 set _processCmd=.\TestDaemon.exe ::需要守护的进程所监听的端口 set _port=8099 ::注意:批处理不会自动创建文件夹 set _logPath=.\monitor.log\%date:~0,4%-%date:~5,2%.log ::格式化日期时间,用于打印日志 call :getDateTime ::通过进程的端口是否正在被监听检测 netstat -an | find /C "0.0.0.0:%_port%" > temp.txt set /p conn= < temp.txt del /F temp.txt if "%conn%" == "0" ( start %_processCmd% | echo %check_date% %check_time% Start %_processName% >> %_logPath% ) else ( echo %check_date% %check_time% conn: %conn% %_processName% OK >> %_logPath% ) ::格式化日期时间函数 :getDateTime
::日期 yyyyMMdd set check_date=%date:~0,4%-%date:~5,2%-%date:~8,2% ::时间 HH:mm:ss set check_time=%time:~0,2% if /i %check_time% LSS 10 ( set check_time=0%time:~1,1% ) set check_time=%check_time%:%time:~3,2%:%time:~6,2% goto:eof