【问题标题】:Restart batch file on crash/error在崩溃/错误时重新启动批处理文件
【发布时间】:2013-07-10 16:44:05
【问题描述】:

我有一个遇到多个错误的批处理文件。这些错误需要强制关闭命令提示符。这导致我不得不再次打开文件来解决问题。

由于此应用程序的性质,它需要一直运行。

我正在寻找一种在遇到错误时自动重新启动文件的方法。有没有我可以使用的命令?

您能否详细描述一下该命令为什么会完成这样的解决方案?

【问题讨论】:

  • 这完全取决于错误。没有办法说。仅当您的批处理文件实际崩溃/关闭时,它不可能自行重新启动。就我个人而言,我宁愿解决实际问题(错误原因),也不愿实施这项工作。
  • 您好,感谢您的回复。老实说,每次的错误都是不同的。
  • 我会说什么。我在 Windows 上运行的是 ffmpeg。每次的错误都不一样。错误是完全随机的。

标签: file batch-file


【解决方案1】:

更新:

为了实现您的目标,我建议将您的 batch 变成 Service。 (Documentation here) 通过将您的 batch 转换为 Service不再受用户登录、权限问题的影响,它将作为系统帐户运行。这本身就可以减轻很多对流程的愤怒。

完成之后,您可以编写一个 batch 文件来确保您的 Service 确实在运行。您当前的问题是它不会自动重新启动。好吧,Service 总是会运行——即使它有错误,它仍然会尝试运行。

这意味着除非它有 Fatal Exception,否则您的 Service 应该始终有效 - 但可以肯定的是,您可以创建一个 batch 来确保您的服务正在运行

一个例子:

 :START
timeout 3600
for /F "tokens=3 delims: " %%H in ('sc query "MyServiceName" ^| findstr "
    if /I "%%H" NEQ "RUNNING" (

    NET START "MyServiceName"
    REM Service has Started...
    )
)
GOTO START

所以理论上每 3,600 秒它会测试您的 Service 是否正在运行,如果不是,它将为您启动 Service

重要: 这更适合解决您的问题,而不是规避它。但是,正如我所指出的,您的 batch 仍应请求Exception Handling 以确保您的应用程序不会陷入不可用状态。这仍然不是最好的方法,因为它应该请求 Exception HandlingVerification 来测试它的状态。

正如我之前提到的,您有很多方法可以解决您的问题。但是,您的想法是线性思维模式。这意味着:

  • 执行命令,保证目标。
  • 如果我这样做,就会发生这种情况。

基本上基于我看到的最小示例,您似乎创建了一个无限循环来不断执行您的命令。我的问题是:当你的循环出现错误时,它如何继续运行?

您已经说过它发生在随机区域 - 没有什么是随机的,那些更有可能需要一些验证/测试以确保它保持在正确状态的区域。 您发现潜在问题的速度越快,您的程序就能越有效地运行而不会出现错误。

希望对你有所帮助-


您的批处理应用程序究竟是做什么的?

我问的原因是因为您可以使用 Windows 任务计划程序 来规避这个问题,它允许您根据您的情况配置一些参数来自动启动和自动打开规定的标准。 会很理想吗?它会真正根据您的需求实现自动化吗?很有可能不会。

正如 GolezTrol 上面提到的,您的错误原因将是解决您的问题的更重要方面。根据您的评论

说实话,每次的错误都不一样。

这可能表明批处理脚本不遵守测试,而是假设它成功完成。没有任何下划线信息,例如:

  • 功能
  • 代码示例
  • 发生错误的位置和执行任务。

这让你很难找到正确的方向。我会考虑的一件事是IF。这是一项基本任务,但非常重要-

if(Directory.Exists(dirName))
{
      // Do This
}
else
{
     // Do This
}

我发现C# 大纲是一种更容易理解IF 用途的方法。您实际上可以在 batch 中实现类似的东西。你可以这样完成它:

if exist { insert file name } (
    rem file exists
) else (
    rem file doesn't exists
)

或者你可以这样完成:

if exists c:\myFile.bat notepad c:\myFile.bat

如果C:\myFile.bat 存在,则打开记事本。这是一个重要的原因是因为如果变量不存在,那么它不会受到影响。这允许您的应用程序以非常原始的方式做出决定。

你有相当多的灵活性 - 关于这个主题有很多示例,因为 批处理编程 已经存在了非常非常长的时间。另一种选择是最终迁移到 Powershell。它将有权访问 Windows 管理界面 (WMI)

希望这会为您指明正确的方向,如果没有更多信息,我们的答案可能不会有太大帮助。


【讨论】:

  • 嗨,我正在运行的命令是这样的:":loop ffmpeg -i "RTMP://IPADDRESS:1935/LIVE/STREAMNAME.STREAM pageUrl=URL.COMswfurl=domain.com/licensed/player-licensed.swflive=1" -isync -vcodec copy -b:v 400k -acodec copy -b:a 128000 -ar 32000 -f flv "rtmp://IP:1935/LIVE/CHANNELNAME" goto loop" 不知道如何停止错误。感谢您的回复 Greg 但我不明白您给我的命令。
  • @JamesBarnes if statement 允许您在实际执行命令之前测试条件。
  • 嗨 所以这个“如果存在 c:\myFile.bat 记事本 c:\myFile.bat”会在出错时重新启动吗?老实说,我不明白这些。
  • @JamesBarnes 不,它不会重新启动 - 但如果它检测到问题,例如文件不存在,那么它不会尝试打开它 - 因为它知道它不存在.这是一个基本概念 - 例如,如果成功,您可以使用它来 ping IP 地址测试,然后尝试执行您的代码以加载 URL。只是一个例子-
  • 老实说,我只是想要一个自动重启 bat 文件的命令。你是否有一个?因为我的 bat 文件确实存在。
【解决方案2】:

我相信,最简单的方法是再创建一个带有 GOTO 语句的 .bat 文件:

@echo off
:startover
echo (%time%) App started.
call "c:\app.bat"
echo (%time%) WARNING: App closed or crashed, restarting.
goto startover

【讨论】:

    【解决方案3】:

    这可能会解决您的问题:

    http://nssm.cc/usage

    基本上,它的作用是将一些 bat 文件添加到 nssm 并使其成为服务。

    在“退出操作”部分它说:

    要配置应用程序退出时 nssm 应采取的操作,请编辑键 HKLM\System\CurrentControlSet\Services\servicename\Parameters\AppExit 的默认值。如果 nssm 运行时注册表中不存在该键,它将创建它并将值设置为 Restart

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 2021-01-21
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多