如何制作脚本/程序以使其始终运行?

Posted

技术标签:

【中文标题】如何制作脚本/程序以使其始终运行?【英文标题】:How to make script/program to make it so an application is always running? 【发布时间】:2010-03-10 04:56:22 【问题描述】:

我有一个需要连续运行的简单 .exe。

不幸的是,有时它会意外崩溃,对此无能为力。

我在想一个 C# 程序,它在计时器上扫描正在运行的应用程序树,如果进程停止运行,它会重新启动它...?不过不知道该怎么做....

还有其他想法吗?

【问题讨论】:

“有时它会意外崩溃,对此无能为力。”这就是软件很烂的原因。 【参考方案1】:

这样做相当容易,但“意外崩溃,对此无能为力”对我来说听起来很可疑。也许您的意思是有问题的程序来自第三方,您需要解决他们无法/不会解决的问题?

无论如何,有很多sample code 可以完全按照您的要求行事。

【讨论】:

你试过了吗?看起来很有趣,可能应该适合我的项目。您是否在它自己的进程而不是其他进程上尝试过这个? 就个人而言,不——我更喜欢消除崩溃问题而不是解决它。【参考方案2】:

第一个解决方案是修复您的 EXE,使其不会崩溃。如果现在不能修复,可能需要添加异常处理,这样才能捕获异常,而不是关闭EXE。

第二种解决方案是编写简单的保护程序,它将启动您的简单 .exe 并监控特定的进程句柄。它会在关闭时重新启动您的程序。

【讨论】:

什么守卫程序也崩溃了?如果这两个 exe 都互相监控就好了。 @Nullstr1ng:应该正确编写守卫程序,以免崩溃。 无论如何,他真的必须修复这些崩溃,或者只是将其全部捕获并制作一个包含错误详细信息的日志文件。 @James,可能只是一种预防措施。假设他们找到了警卫程序并故意终止它。【参考方案3】:

最简单的方法是让您编写程序查看其自身的实例是否正在运行,如果是则退出。设置计划任务以每隔几分钟运行一次。

class Program

    static void Main(string[] args)
    
        if (IsRunning())
        
            return;
        
        else
        
            for (int x = 0; x < 10; x++)
            
                //Do Stuff
                System.Threading.Thread.Sleep(1000);
            
        
    

    private static bool IsRunning()
    

        Process[] P = Process.GetProcessesByName( Process.GetCurrentProcess().ProcessName  ) ;
        return P.Count() > 1;
    

【讨论】:

按名称搜索进程远非安全。你不能确定你找到的就是你搜索的。【参考方案4】:

过去几天恶意软件偶尔使用的一个技巧是让两个进程分别监控当前正在运行的进程,并在另一个进程终止时重新启动。

System.Diagnostics 命名空间有可以提供帮助的类,尤其是“Process”。

例如

static Process[] Process.GetProcesses()

返回所有当前正在运行的进程的列表。

如果您的其他进程不在此列表中,则只需重新启动它,例如

Process.Start()

【讨论】:

【参考方案5】:

您的程序最初需要自己启动目标进程(使用Process.Start),然后只需等待它终止(使用 Process.Start() 返回的对象上的WaitForExit)。之后重复整个过程。

这样您就可以确定您正在观看您感兴趣的进程,并且您根本不需要轮询进程列表。

Process.Start() 和 WaitForExit() 用法example。

【讨论】:

以上是关于如何制作脚本/程序以使其始终运行?的主要内容,如果未能解决你的问题,请参考以下文章

制作一个从函数返回字符串的数字拼写程序

可以使用气流 BigQueryOperator 制作 DDL bigquery 语句吗?

如何在 iPhone 中为所有版本制作应用程序 [关闭]

我是不是需要删除 UIScrollView 中不可见的子视图以使其平稳运行?

如何将 PowerShell cmdlet 或函数添加到我的计算机以使其始终可用?

如何进行持久通知?