【问题标题】:How to restart program automatically if it crashes in Windows?如果程序在 Windows 中崩溃,如何自动重新启动程序?
【发布时间】:2012-03-09 19:06:46
【问题描述】:

如果我的程序在 Windows 2003 服务器上崩溃,我如何自动启动它?有时我的程序会崩溃,我可以在窗口或设置中设置方法吗?

【问题讨论】:

  • 什么样的程序? Windows 服务还是常规应用?
  • 嗯,“有时我的程序会崩溃”。似乎更好的方法是找出程序崩溃的原因并修复它。创可贴很棒,因为身体可以自我修复。您的程序并非如此。
  • 当然你想让你的程序不崩溃。这是一个为之奋斗的伟大理想。但即使是最强大的程序也会偶尔崩溃。如果您在服务器环境中,那么在发生崩溃时重新启动会很有意义。您仍然可以记录崩溃并尝试消除它们,但您的用户会更开心,因为每次崩溃都不会延长停机时间。

标签: windows windows-server-2003


【解决方案1】:

通常的方法是运行所谓的 guardian 进程。这是一个单独的进程,通常是一个服务,用于监控主进程的状态。当守护者检测到主服务已经死亡时,它会重新生成它。

据我所知,没有内置的 Windows 功能可以为您执行此操作。

【讨论】:

  • 服务的内置功能,“恢复”选项卡。
  • 我宁愿想象“程序”这个词的使用暗示问题涉及桌面程序。
  • 不,服务是真正的 exe。只需几个约定即可让用户保持控制。
  • 好吧,服务在不同的会话中运行等等。自然,它们只是像任何其他可执行文件一样的可执行文件。如果“程序”是一项服务,那么恢复设置无疑是必经之路。一个应该一直运行的“程序”在任何情况下都应该是一个服务。
  • 不幸的是它是一个程序而不是一个服务。所以我需要帮助重新启动程序。是否有任何第三方工具可以完成这项工作?
【解决方案2】:

有几种方法可以在 Windows 上创建进程主管/监护人进程。 首先,是利用 Windows 命令行功能。创建一个bat文件:

@echo off
:start
start /w "your app to watch.exe"
goto start

start /w 将等待进程退出。当进程崩溃退出时,bat脚本会重新启动它。

另一种选择是使用免费的supervisor 工具https://github.com/chebum/Supervisor。它允许重新启动崩溃的应用程序,并且它允许一次监控两个或多个应用程序,并且当主管的窗口关闭时它会自动关闭这些应用程序。

【讨论】:

  • 我必须对这一行做一个小的修改才能使它工作:START /WAIT "" "your app to watch.exe" START 命令语法使用引号中的第一个字符串作为新的(控制台)窗口标题。
【解决方案3】:

注意:运行自循环 bat 文件可能很有用,但除非您知道自己在做什么,否则它们可能会造成各种破坏。如果您在启动时运行它们尤其如此。您已收到警告。

无论如何。我只记得我 286 天的一些事情,当时我经常玩 BAT 文件。如果你写文件

yourprogram.exe
some other event

BAT 文件将运行您的程序,然后在后台暂停并等待,直到程序退出。之后它将运行“其他事件”。如果您想一次运行多个东西,这曾经有点烦人,但在这里它实际上很有用。使用它,可以让它运行一个循环,在程序退出后立即重新启动程序(并重新运行 bat 文件)。将此与https://superuser.com/questions/62525/run-a-completly-hidden-batch-file 结合使用,您甚至都不会看到它发生。

最终的 BAT 文件(本例中为“restart.bat”)将如下所示:

c:\[location]\yourprogram.exe
wscript "C:\[location]\invisible.vbs" "C:\[location]\restart.bat"

就是这样。使用第 2 行启动程序(通过任务启动,甚至只是启动文件夹),这应该可以解决您的问题 :)

哦,如果你想停止循环,只需将bat文件重命名或在两行前面加上“//”,保存,然后退出程序。

如果您正在运行的程序需要管理员权限,我找到的解决方案是使用 psexec (http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx) 以提升的权限运行程序和 bat。在这种情况下,BAT 将如下所示:

c:\[location]\psexec -h c:\[location]\yourprogram.exe
c:\[location]\psexec -h wscript "C:\[location]\invisible.vbs" "C:\[location]\restart.bat"

然后您以管理员身份运行 bat,或使用提升的权限从任务调度程序运行第二行(不带 psexec 部分)。请注意:以普通用户身份运行它并在 UAC 提示符上单击“否”给了我一个 BSOD,可能是因为它循环了“由于缺少权限而无法运行程序”数十亿次之类的 :)

【讨论】:

  • 不错的概念。您甚至可以避免使用批处理文件和 invisible.vbs,而是在一个 VBScript 中执行,例如:'保持计算器打开 Set objShell = WScript.CreateObject("WScript.Shell") ObjShell.run "calc.exe", 1,真正的 ObjShell.run (Wscript.ScriptFullName)
【解决方案4】:

您可以使用RegisterApplicationRestart.

"如果您注册重新启动并且应用程序遇到 未处理的异常或没有响应,向用户提供 重新启动应用程序的机会;该应用程序不是 未经用户同意自动重启。 "

对于无需用户干预的自动重启,还有RestartOnCrash。适用于所有 Windows 版本。

【讨论】:

  • 需要自己写一个c#程序,万一这个RestartOnCrash.cs自己崩溃了怎么办?
【解决方案5】:

我正在寻找类似的东西。有两个选项可以处理这个问题 - 您可以自己编写一个小脚本,或者使用已经存在的东西。

经过一番谷歌搜索后,我发现了这个不错的list。博主编译了大约 8 个工具来自动重启崩溃或关闭的应用程序。

【讨论】:

    【解决方案6】:

    不幸的是,Windows 中没有设置可以在常规程序崩溃时自动重新启动它。

    您需要主动与应用程序的 GUI 交互吗?一些Service Wrappers(旨在将任何应用程序作为 Windows 服务运行)会监视您的应用程序并在它失败时重新启动它,但请务必调查Session 0 Isolation 以确保它不会妨碍您。

    【讨论】:

      【解决方案7】:

      您可以使用一些特殊的应用程序,例如BDV SystemEvents 或任何其他应用程序。它允许您指定在关闭另一个应用程序时将启动的应用程序。将相同的应用程序指定为条件和操作,您将获得预期的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-29
        • 1970-01-01
        • 2017-04-10
        • 1970-01-01
        相关资源
        最近更新 更多