在windows中监测某个程序是否崩溃并重启该程序

请问各位大佬有没有一种软件,运行在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个结果:

  1. NSSM: http://nssm.cc/
  2. WinSW: GitHub - winsw/winsw: A wrapper executable that can run any executable as a Windows service, in a permissive license.
  3. Run as Service: http://runasservice.com/
  4. Shawl: GitHub - mtkennerly/shawl: Windows service wrapper for arbitrary commands
  5. FireDaemon: http://www.firedaemon.com/ 这个好像也是要钱的
  6. Daemon Master: GitHub - TWC-Software/DaemonMaster: Daemon Master is a software which makes it possible to create a service from any program (ALPHA)
  7. Application as Service: http://www.application-as-service.com/ alternateto网站给了个警告,说网站信誉差(而且母公司是做虚拟USB和串口相关开发的……),何况这个不免费。
  8. 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 标签,继续监测和重启程序。