本案例实现监控一个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()