监控程序生命的最佳实践

时间:2010-09-03 16:54:56

标签: language-agnostic process-monitoring

我想听听您对计划生命监控的看法。

这就是场景。你有一个简单的程序通常有效,这意味着它写得很好,处理异常等等。

如果您想确保此计划有效 FOREVER ,您将如何运作?

没有像crontab这样的外部工具可用,但可以添加任何开销。

使用另一个持续“ping”主程序的程序?触摸文件并检查其他程序以进行文件修改?

你如何确保第二个程序始终有效?

所以,来吧,告诉我你在这方面的意见或最佳做法!

作为脚注,我要用Python编写这个程序,但这是一个通用的问题!

3 个答案:

答案 0 :(得分:5)

在嵌入式系统中,通常做的是看门狗模块。

监视程序检查某个位置(可能是文件,可能是内存位置,无论如何),如果位置不符合条件,则重新启动正在检查的系统。

因此,您可能在探测程序中执行的操作是定期编写一些带有纪元戳的programname_watchdog文件。这将是常规循环的一部分。

然后你的看门狗(在一个完全不同的过程中)会检查文件。如果列出的日期已经过时,则其他程序将被终止并重新启动,因为它将被视为严重故障(挂起或崩溃)。请注意,您的看门狗将具有一些简单的逻辑,因此失败的可能性要低得多。

积极还有其他方法可以实现这一目标。这只是一种方式。

编辑:您必须考虑系统构建的堆栈。您拥有的外部依赖项越多,失败的风险就越大。如果您正在寻找完美的操作,您还必须考虑程序正确性的正式证明。

问题真的成为您对系统的期望;什么样的失败是不可接受的,什么样的失败是预期的,所以你可以补偿它们。

这个问题很快成为证明 - 硬件 - 软件协同设计问题(也很昂贵)。我很想知道你在做什么以及你的解决方案是什么。

答案 1 :(得分:0)

像保罗内森说的那样,使用看门狗。

您可以采取一些措施使事情变得更加健壮,例如:

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中用于过程控制的实际代码的pseudeocode样本。

它的原始,但它的工作原理。这不仅可以确保远程进程处于活动状态,而且如果远程进程的计算速度有所下降(扫描速率受程序大小和复杂性影响),它将确保两个进程仍然同步。

如果您需要更多数据,请开始调查Modbus使用的返回代码,或OPC协议如何处理其Quality字节。

答案 2 :(得分:0)

好。我一直在想这个问题,有两件事情已经出现了。

软件看门狗应该如此简单,以至于不可能在附近崩溃。对于疯狂的人来说,一个有趣的编程挑战可能是编写一个 net 的监视器,用不同的语言编写,必须与其他语言保持一致,所有这些都应该监视主进程。

即使具有挑战性和趣味性,但这似乎是浪费时间,而且情景看起来像战争中的士兵。

其次,在我正在开发的应用程序中,我有一个硬件看门狗,它应该始终存在于关键操作中。

所以现在我的应用程序有一个软件看门狗,它可以刷新硬件,并监控程序的使用寿命。

最后,保罗,我完全同意你的看法。