我想听听您对程序生命周期监控的看法。
这就是场景。您有一个通常可以运行的简单程序,这意味着它编写得很好,处理了异常等等。
如果您想确保该程序永远有效,您将如何操作?
没有像 crontab 这样的外部工具可用,但可以添加任何开销。
使用另一个不断“ping”主程序的程序?触摸一个文件并用另一个程序检查文件修改?
您如何确保第二个程序始终有效?
所以,来吧,告诉我在这种情况下你的意见或最佳实践是什么!
作为脚注,我必须用 Python 编写这个程序,但这是一个通用问题!
我想听听您对程序生命周期监控的看法。
这就是场景。您有一个通常可以运行的简单程序,这意味着它编写得很好,处理了异常等等。
如果您想确保该程序永远有效,您将如何操作?
没有像 crontab 这样的外部工具可用,但可以添加任何开销。
使用另一个不断“ping”主程序的程序?触摸一个文件并用另一个程序检查文件修改?
您如何确保第二个程序始终有效?
所以,来吧,告诉我在这种情况下你的意见或最佳实践是什么!
作为脚注,我必须用 Python 编写这个程序,但这是一个通用问题!
在嵌入式系统中,经常做的是看门狗模块。
看门狗检查某个位置(可能是文件,可能是内存位置,等等),如果该位置不符合标准,则重新启动检查中的系统。
因此,您可能会让您的程序处于探测状态,即定期编写一些带有纪元标记的 programname_watchdog 文件。这将是常规循环的一部分。
然后你的看门狗(在一个完全不同的过程中)会检查文件。如果列出的日期已经过时,另一个程序将被终止并重新启动,因为它会被视为严重故障(挂起或崩溃)。请注意,您的看门狗将有一些简单的逻辑,因此它失败的机会要低得多。
我很肯定还有其他方法可以做到这一点。这只是一种方式。
编辑:您必须考虑构建系统的堆栈。您拥有的外部依赖项越多,失败的风险就越大。如果您正在寻找完美的操作,您还必须考虑程序正确性的正式证明。
问题真的变成了您对系统的期望;什么样的故障是不可接受的,什么样的故障是预期的,所以你可以弥补它们。
这个问题很快就变成了一个证明硬件-软件协同设计的问题(而且也很昂贵)。我很想知道您在做什么以及您的解决方案是什么。
就像 Paul Nathan 说的,使用看门狗。
不过,您可以做一些事情来使事情变得更健壮,例如:
int lastTick;
int RemoteProcessState()
{
int tick = GetRemoteTick();
if (tick == -1)
{
// Process recoverable error state.
return -1;
}
if (tick == -2)
{
// Process unrecoverable error state.
return -1;
}
if (tick < 0)
{
// Detect if the watchdog is overflowed.
return -1;
}
if (abs(abs(tick) - abs(lastTick)) > ALLOWED_PROCESS_LAG)
{
// Resynchronize process
}
else
{
// Process running normally.
}
return 0;
}
这是嵌入式 RTU 中用于过程控制的真实代码的伪代码示例。
它的原始,但它的工作原理。这不仅可以确保远程进程处于活动状态,而且如果远程进程的计算速度出现偏差(扫描速率受程序大小和复杂性的影响),它将确保两个进程仍然同步。
如果您需要更多数据,请开始研究 Modbus 使用的返回代码,或者 OPC 协议如何处理管理其Quality
字节。
出色地。我对这个问题思考了很久,结果出现了两件事。
软件看门狗应该非常简单,以至于崩溃应该是不可能的。对于疯狂的人来说,一个有趣的编程挑战可以是编写一个用不同语言编写的看门狗网络,它们必须彼此保持活力,并且应该一起监视主进程。
即使具有挑战性和趣味性,这似乎也很浪费时间,而且场景看起来像战争中的士兵。
其次,在我正在开发的应用程序中,我有一个硬件看门狗,它应该始终存在于关键操作中。
所以现在我的应用程序有一个软件看门狗,它可以刷新硬件,并监控程序的生命周期。
最后,保罗,我完全同意你的看法。