意外退出时将进程状态设置为错误
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
:进程已崩溃。
我会这样做:
您添加第二个 table,在其中记录 RunID 和 DateTime。您可以从程序中每隔 second/ten seconds/minute(无论您想要什么时间间隔)更新此 table 作为某种后台任务。 "update" 我的意思是您要么更新现有记录,要么添加一条新记录,无论您认为什么是最好的。
第二个进程定期检查此日志 table 以查找主 table 中当前状态为 "Running" 的所有 RunId,并且每当没有特定 RunId 的 "fresh" DateTime(例如,您每 10 秒记录一次,日志中最新的 table 来自 20+ 秒前)您将 "Running" 状态更新为 "Crashed".
我有一个可以并行 运行 的程序,即进程的多个实例可以同时 运行。假设它是一个名为 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
:进程已崩溃。
我会这样做:
您添加第二个 table,在其中记录 RunID 和 DateTime。您可以从程序中每隔 second/ten seconds/minute(无论您想要什么时间间隔)更新此 table 作为某种后台任务。 "update" 我的意思是您要么更新现有记录,要么添加一条新记录,无论您认为什么是最好的。
第二个进程定期检查此日志 table 以查找主 table 中当前状态为 "Running" 的所有 RunId,并且每当没有特定 RunId 的 "fresh" DateTime(例如,您每 10 秒记录一次,日志中最新的 table 来自 20+ 秒前)您将 "Running" 状态更新为 "Crashed".