意外退出时将进程状态设置为错误

Set process status to error when exited unexpectedly

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

.exe 文件

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

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

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

解决方案是在进程启动时使用该进程的 ID 在某处创建一个临时文件。当它结束时 ("Run", "Error") 删除这个文件。这样,您可以在程序的下一个 运行 之前查看文件是否仍然 运行ning,然后决定要做什么。

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

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

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

因此,您有以下情况:

  • status = "Run": 进程成功完成。
  • status = "Error": 进程结束但出现错误。
  • 状态="Running"heartbeat >= current timestamp - x:进程是运行.
  • 状态="Running"heartbeat < current timestamp - x:进程已崩溃。

我会这样做:

  1. 您添加第二个 table,在其中记录 RunID 和 DateTime。您可以从程序中每隔 second/ten seconds/minute(无论您想要什么时间间隔)更新此 table 作为某种后台任务。 "update" 我的意思是您要么更新现有记录,要么添加一条新记录,无论您认为什么是最好的。

  2. 第二个进程定期检查此日志 table 以查找主 table 中当前状态为 "Running" 的所有 RunId,并且每当没有特定 RunId 的 "fresh" DateTime(例如,您每 10 秒记录一次,日志中最新的 table 来自 20+ 秒前)您将 "Running" 状态更新为 "Crashed".