请问各位大佬有没有一种软件,运行在windows server平台上,监控某个程序崩溃出错,然后自动重新运行这个程序的软件。
我在win server上运行了一个教学用的视频推流服务的程序,但有时候会无故崩溃报错,影响教学收看,所以想问问是否有可以自动将此程序重启的软件。
曾经写过一个基于bat的,代码比较简陋,大概就是
启动后每隔5秒监测一次进程是否存在,不存在就重启。
@echo off
SetLocal EnableDelayedExpansion
start /b "" "这里写软件的启动程序地址"
goto 1
:1
tasklist | find "这里写软件的进程名"
if errorlevel 1 (echo 不存在)&(ping 127.1 -n 5 >nul 2>nul)&(goto 2)
if errorlevel 0 (echo 存在)&(ping 127.1 -n 5 >nul 2>nul)&(goto 1)
:2
start /b "" "这里写软件的启动程序地址"
写一个 ahk 或者 bat 就行了。
bat 演示
@echo off
title 监控并重启程序
:jk
tasklist |find "WeiXin.exe"||start WeiXin.exe
timeout /t 60
goto jk
timeout /t 60
这个是用来延时的, 60就是60秒, 意味着60秒检查一次。
底下推荐process lasso,可以设置自动保持运行的~而且主要功能是调配运行资源避免卡顿,我觉得有可能能有助于减少该程序自动退出的可能性。
哦,问题是共享软件。接下来的,我就不说了。
有个AlwaysUp不过是要钱的。
类似软件: https://alternativeto.net/software/always-up/ (本质就是应用程序转服务)
搜出来有8个结果:
- NSSM: http://nssm.cc/
- WinSW: GitHub - winsw/winsw: A wrapper executable that can run any executable as a Windows service, in a permissive license.
- Run as Service: http://runasservice.com/
- Shawl: GitHub - mtkennerly/shawl: Windows service wrapper for arbitrary commands
- FireDaemon: http://www.firedaemon.com/ 这个好像也是要钱的
- Daemon Master: GitHub - TWC-Software/DaemonMaster: Daemon Master is a software which makes it possible to create a service from any program (ALPHA)
- Application as Service: http://www.application-as-service.com/ alternateto网站给了个警告,说网站信誉差(而且母公司是做虚拟USB和串口相关开发的……),何况这个不免费。
- Turbo Service Manager: Turbo Services Manager
谁试完了记得反馈一下,比如那个比较好用(功能全面或者支持CLI之类)
不对吧,报错不是闪退.怎么都是检测程序退出的…
退出了还怎么报错…
应该检查报错的界面呀
AHKV2简单示例,带退出以临时切换暂停的
以Notepad3为例子
核心就是aclass ,它必需和崩溃界面的不一样
还有其他标识,例如标题等等.总之用它判断是否崩溃
notepad3 := "D:\OneDrive\Program\Notepad3\Notepad3.exe"
;窗口的class 用于检查窗口是否存在
aclass := "ahk_class Notepad3"
;保存程序的pid用于结束
pid := WinGetPID(aclass)
loop
{
;等待程序不在激活状态
WinWaitNotActive(aclass)
;假如有其他程序无意干扰则重新激活窗口进入下一轮等待
if WinExist(aclass)
WinActivate(aclass)
else ;窗口不存在了崩溃了?
{
;结束进程
if ProcessExist(pid)
ProcessClose(pid)
; 延时5秒重新启动
Sleep(5000)
Run(notepad3)
}
}
;加入快捷键退出本脚本防止无法退出或激活其他窗口 win+p
#p:: ExitApp()
;加入快捷键切换暂停脚本防止无法退出或激活其他窗口 win+o
#o:: Pause(!A_IsPaused)
上面那个支持闪退,假如每次都只是报错而不是闪退的话上面很多步骤是多余的
aclass 在这里变成报错窗口的标识了,只要此窗口出现了就重启
notepad3 := "D:\OneDrive\Program\Notepad3\Notepad3.exe"
;窗口的class 用于检查窗口是否存在
aclass := "ahk_class Notepad3" ;找出报错窗口的标识这里无法正确启用
;保存程序的pid用于结束
pid := WinGetPID(aclass)
loop
{
;等待报错窗口出现
WinWait(aclass)
;结束进程
if ProcessExist(pid)
ProcessClose(pid)
; 延时5秒重新启动
Sleep(5000)
Run(notepad3)
; 进入下一轮等待
}
;加入快捷键退出本脚本防止无法退出或激活其他窗口 win+p
#p:: ExitApp()
;加入快捷键切换暂停脚本防止无法退出或激活其他窗口 win+o
#o:: Pause(!A_IsPaused)
以后,这种问题,都可以交给 ChatGPT 去回答了。
以下是一个示例的 Windows 批处理脚本,用于监测一个程序是否崩溃退出,并在需要时重启这个程序:
@echo off
set program_name=myprogram.exe
set restart_delay=10
:start
tasklist | find /i "%program_name%" > nul
if %errorlevel% equ 0 (
echo %program_name% is running.
) else (
echo %program_name% has stopped. Restarting...
start "" "%program_name%"
timeout /t %restart_delay%
)
goto start
脚本中的 program_name
变量指定要监测和重启的程序的名称。restart_delay
变量指定重启程序之前的等待时间(单位为秒)。
脚本使用 tasklist
命令来列出当前正在运行的任务列表,并使用 find
命令在列表中查找是否存在要监测的程序。如果该程序正在运行,则脚本会显示一条消息表明程序正在运行。否则,脚本将显示一条消息表明程序已停止,并使用 start
命令重启程序。在重启程序之前,脚本会使用 timeout
命令暂停一段时间,以便给程序关闭和清理的时间。
最后,脚本使用 goto
命令返回到 start
标签,继续监测和重启程序。