【问题标题】:Set process status to error when exited unexpectedly意外退出时将进程状态设置为错误
【发布时间】:2015-02-02 12:40:04
【问题描述】:

我有一个可以并行运行的程序,即可以同时运行多个进程实例。假设它是一个名为MyProgram.exe.exe 文件。

该程序的每次运行都会在名为RunId 的数据库中创建一个唯一ID。每次运行都有一个status。状态可以是"Running""Run""Error"。当程序开始运行时,状态设置为“正在运行”,最终,如果一切正常,状态将更新为“运行”或出现错误时更新为“错误”。

这一直有效,直到程序意外退出。例如,当服务器突然关闭时。在这种情况下,该特定运行的状态将保持"Running",这是不正确的。这会导致程序混乱。

上次我对这个问题进行快速研究时,有人推荐了一个明智的解决方案,不幸的是,这可能不适用于我的情况:

解决方案是在进程启动时在某处创建一个带有该进程 ID 的临时文件。当它结束时(“运行”,“错误”)删除这个文件。这样,您可以在下次运行程序时查看文件是否仍在运行,然后决定要做什么。

这个解决方案的问题是当我们看到一个临时文件并且程序真的还在运行时!这意味着程序没有意外退出,但需要一段时间才能完成。所以我们不想终止它。

长话短说,当我们的程序意外存在时,我们如何以更好的方式通知自己?

【问题讨论】:

  • 临时文件的解决方法好像不错。您的进程只需要专门锁定文件。当文件被锁定时,你知道程序正在运行......

标签: c# process


【解决方案1】:

您可以使用心跳:至少每 x 秒,每个"Running" 进程都会使用当前服务器时间戳更新其行的heartbeat 列。

因此,您有以下情况:

  • status = "Run":进程成功完成。
  • status = "Error": 进程完成但出现错误。
  • status = "Running" heartbeat >= current timestamp - x:进程正在运行。
  • status = "Running" heartbeat < current timestamp - x:进程已崩溃。

【讨论】:

  • 漂亮的解决方案!将实现这一点。是心跳。
【解决方案2】:

我会这样做:

  1. 添加第二个表,在其中记录 RunID 和 DateTime。作为某种后台任务,您可以从程序中每秒/十秒/分钟(无论您想要什么时间间隔)更新此表。 “更新”是指您要么更新现有记录,要么添加新记录,无论您认为什么是最好的。

  2. 第二个进程会定期检查此日志表以查找主表中当前状态为“正在运行”的所有 RunId,并且只要特定 RunId 没有“新”日期时间(例如,您登录每 10 秒一次,日志表中最新的是 20 多秒前)您将“正在运行”状态更新为“已崩溃”。

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 2020-11-02
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    相关资源
    最近更新 更多