Answers:
这并不总是可行的(它取决于程序如何加载自身),但是通常您可以创建一个批处理文件,如下所示:
@Echo off
:Start
NotePad
echo Program terminated at %Date% %Time% with Error %ErrorLevel% >> c:\logs\program.log
echo Press Ctrl-C if you don't want to restart automatically
ping -n 10 localhost
goto Start
我以记事本为例。
线
echo Press Ctrl-C if you don't want to restart automatically
ping -n 10 localhost
只是一个延迟(10秒),使用户有机会中止该过程,然后再次启动。
线
echo Program terminated at %Date% %Time% with Error %ErrorLevel% >> c:\logs\program.log
不需要,但是在程序每次关闭文件时都会记录日志,因此对诊断问题可能很有用。ErrorLevel可能不会告诉您太多信息,但是如果程序正常关闭,则应该返回0,否则返回0。 -零消息(如果没有)
注意,您提到您的程序如果已经运行则不会执行任何操作。这通常意味着应用程序启动,检测到另一个副本已在运行并立即关闭。如果真是这样,并且您的程序在启动此批处理文件之前已运行,则该批处理将循环运行,并尝试每十秒钟启动一次程序。
根据上面的回答,我建议您将该命令放入批处理文件中,然后将该批处理文件设置为每分钟作为计划任务运行。几乎没有与此相关的开销,并且它确保您的流程得到声明,无论您是否打算停止它都可以。
我想这个问题的正确答案取决于您为什么要这样做。您是否要解决意外关机的问题?防止机器用户(例如关闭监视软件的员工)随意地“恶意”关闭?防止严重和熟练的恶意攻击?您是否正在尝试自己编写恶意软件(在这种情况下,请删除;-))?
另外,正如其他评论者所提到的,如果您编写了Windows服务,则情况会有所不同(例如)
就个人而言,我可能首先编写另一个应用程序,然后以相同的方式启动它。让两个应用程序定期相互扫描并在必要时重新启动-确保您提供了一种简单的方法来使应用程序合法关闭!
话虽如此,并考虑到您的评论“有时我会发现它本身已经关闭”,所以实际上我将首先尝试找出其关闭的原因...
您可以使用一个名为ReStartMe 2.0 [ Mirror ]的程序来做到这一点:
监视进程,并在进程关闭时重新启动它们。
这样更好!这是我用于防雷游戏服务器的一些代码,应保存在.bat文件中
@echo off
rem This is a comment line
rem This one is a comment too
rem Following line ensures the working directory is searched in C:
C:
rem Join the correct directory, where the server stuff lies in:
cd "C:\Users\morenavaj\Documents\minetest-0.4.16-win64 - Lone_Wolf\"
:love_spaghetti_code
bin\server.lnk --config minetest.conf ^
--worldname "Land of Blockheads" ^
--gameid minetest_game ^
--port 30000 ^
--logfile bin/debug.txt
echo Restarting server....
goto love_spaghetti_code
echo Done (this should never, ever, happen)