windows系统上exe程序看门狗
本案例实现监控一个exe的windows应用是否在运行,如果没有在运行就启动起来的功能。 项目目录结构:
一、配置文件setting.json
{"cubePath": "C:\\Users\\gx771\\Desktop\\Cube\\electron\\Cube\\20200716\\Cube-win32-x64\\cube.exe","spaceTime": "20000","serviceName": "cubeWatcher"}
二、后端index.js脚本 每20s查询一次cube.exe程序是否正在运行,若没有运行,则启动
fs = require 'fs' path = require 'path' settingPath = path.resolve(__dirname, './setting.json') data = fs.readFileSync settingPath, 'utf-8' setting = JSON.parse data console.log 'setting:',setting cubeFlag = 0 # cube.exe程序运行状态标记 0未运行 1运行 cubePath = setting?.cubePath # cube.exe的执行程序路径 spaceTime = setting?.spaceTime # 每隔20s检查一遍cube的进程是否还在 startTime = Date.now() # 当前时间 # 启动cube.exe程序 exec = require('child_process').execFile fun = ()=> console.log 'fun() start' exec(cubePath, ['/t', '600'],(err,data)-> console.log 'err',err console.log '启动cube后的数据:', data.toString() ) #定时检查cube的状态并更新flag标记,flag为0则执行启动cube.exe的方法 changeStatus = (flag)-> # console.log '---------cube.exe运行状态:',flag if flag == 0 console.log '重启' fun() else console.log '不重启' # 定时检查cube.exe是否在运行 exec = require('child_process').exec isRunning = (query,cb)=> platform = process.platform; cmd = ''; switch platform when 'win32' cmd = "tasklist" break exec(cmd, (err, stdout, stderr)=> status = stdout.toLowerCase().indexOf(query.toLowerCase()) > -1 cb(status) ) checkStatus = (startTime)=> timeNow = Date.now() # console.log('当前时间'+timeNow+'|| 时差:'+(timeNow-startTime)) isRunning('Cube.exe',(status)=> console.log 'status',status if status is true cubeFlag = 1 console.log '--运行中 无需重启--' else if status is false console.log '--未运行 需要启动--' cubeFlag = 0 changeStatus(cubeFlag) ) myInterval = setInterval(checkStatus,spaceTime,startTime);
三、wd.js把index.js的看门狗脚本注册为windows服务
Service = require('node-windows').Service path = require 'path' fs = require 'fs' settingPath = path.resolve(__dirname, './setting.json') data = fs.readFileSync settingPath, 'utf-8' setting = JSON.parse data console.log 'setting-wd:',setting svc = new Service({ name: setting?.serviceName description: setting?.serviceName script: path.resolve(__dirname, './index.js') #nodejs项目要启动的文件路径 # script: 'C:\\Users\\gx771\\Desktop\\微魔方\\electron包\\Cube\\20200716上午11点\\Cube-win32-x64\\cube.exe' }) svc.on 'install',()=> svc.start() svc.install()
四、wd-uninstall.js注销index.js看门狗脚本的服务
Service = require('node-windows').Service path = require 'path' fs = require 'fs' settingPath = path.resolve(__dirname, './setting.json') data = fs.readFileSync settingPath, 'utf-8' setting = JSON.parse data console.log 'setting-uninstall:',setting svc = new Service({ name: setting?.serviceName description: setting?.serviceName script: path.resolve(__dirname, './index.js') #nodejs项目要启动的文件路径 # script: 'C:\\Users\\gx771\\Desktop\\微魔方\\electron包\\Cube\\20200716上午11点\\Cube-win32-x64\\cube.exe' }) svc.on 'uninstall',()-> console.log 'Uninstall complete.' console.log 'The service exists:',svc.exists svc.uninstall()