Language agnostic 监控程序生命周期的最佳实践

Language agnostic 监控程序生命周期的最佳实践,language-agnostic,process-monitoring,Language Agnostic,Process Monitoring,我想听听你对程序生命监控的看法 情况就是这样。您有一个正常工作的简单程序,这意味着它编写得很好,可以处理异常等等 如果您想确保该程序永远有效,您将如何操作 没有像crontab这样的外部工具可用,但是可以增加任何开销 使用另一个程序连续ping主程序?触摸一个文件并用另一个程序检查文件修改 您如何确保第二个程序始终有效 那么,来吧,告诉我在这方面你的意见或最佳做法是什么 作为脚注,我必须用Python编写这个程序,但这是一个通用问题 在嵌入式系统中,通常使用看门狗模块 看门狗检查某个位置可能是文

我想听听你对程序生命监控的看法

情况就是这样。您有一个正常工作的简单程序,这意味着它编写得很好,可以处理异常等等

如果您想确保该程序永远有效,您将如何操作

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

使用另一个程序连续ping主程序?触摸一个文件并用另一个程序检查文件修改

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

那么,来吧,告诉我在这方面你的意见或最佳做法是什么


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

在嵌入式系统中,通常使用看门狗模块

看门狗检查某个位置可能是文件,也可能是内存位置,如果该位置不符合条件,则重新启动正在检查的系统

因此,您的程序可能需要定期编写带有历元戳的programname\u看门狗文件。这将是常规循环的一部分

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

我肯定还有其他方法可以做到这一点。这只是一种方式

<>编辑:你必须考虑系统建立的堆栈。外部依赖性越多,失败的风险就越大。如果你正在寻找完美的操作,你还必须考虑程序正确性的形式证明。 问题真的变成了你对你的系统的期望;什么样的失败是不可接受的,什么样的失败是预期的,这样你就可以补偿它们


这个问题也成为了一个快速且昂贵的硬件-软件协同设计问题。我很想知道您正在做什么,以及您的解决方案是什么。

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

看门狗检查某个位置可能是文件,也可能是内存位置,如果该位置不符合条件,则重新启动正在检查的系统

因此,您的程序可能需要定期编写带有历元戳的programname\u看门狗文件。这将是常规循环的一部分

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

我肯定还有其他方法可以做到这一点。这只是一种方式

<>编辑:你必须考虑系统建立的堆栈。外部依赖性越多,失败的风险就越大。如果你正在寻找完美的操作,你还必须考虑程序正确性的形式证明。 问题真的变成了你对你的系统的期望;什么样的失败是不可接受的,什么样的失败是预期的,这样你就可以补偿它们


这个问题也成为了一个快速且昂贵的硬件-软件协同设计问题。我很想知道你在做什么,你的解决方案是什么。

就像保罗·内森所说的,使用看门狗

不过,您可以做一些事情使事情变得更加健壮,例如:

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协议如何管理其质量字节。

如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协议如何处理其质量字节的管理


嗯。我对这个问题考虑了很久,出现了两件事

一个软件看门狗应该是如此简单,崩溃应该是不可能的。对于疯子来说,一个有趣的编程挑战是编写一个用不同语言编写的看门狗网络,这些看门狗必须一个一个地保持活力,并且所有看门狗都应该监视主进程

即使富有挑战性和趣味性,这似乎是一个巨大的时间浪费,而且场景看起来像是战争中的士兵

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

因此,现在我的应用程序有一个软件看门狗,它刷新硬件看门狗,并监视程序的生命周期


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

嗯。我对这个问题考虑了很久,出现了两件事

一个软件看门狗应该是如此简单,崩溃应该是不可能的。对于疯子来说,一个有趣的编程挑战是编写一个用不同语言编写的看门狗网络,这些看门狗必须一个一个地保持活力,并且所有看门狗都应该监视主进程

即使富有挑战性和趣味性,这似乎是一个巨大的时间浪费,而且场景看起来像是战争中的士兵

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

因此,现在我的应用程序有一个软件看门狗,它刷新硬件看门狗,并监视程序的生命周期


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

永远工作还是永远运行?我真的不想将此作为一个答案发布,但下面是Andy Tanenbaum介绍MINIX 3内核的精彩演讲。这里有一些你可以使用的想法。制作自己的内核。第二。确保你的电脑不会爆炸。我目前正在研究类似的解决方案。我有一个程序,我需要知道它是否没有运行,是否不工作,等等。但是如果我使用另一个程序来自动检查,那么第二个程序不会失败,也不会让我错过第一个程序失败的事实。不幸的是,我还没有一个好的概念性解决方案。可以永远工作还是永远运行?我真的不想将此作为一个答案发布,但下面是Andy Tanenbaum描述MINIX 3内核的精彩演讲。这里有一些你可以使用的想法。制作自己的内核。第二。确保你的电脑不会爆炸。我目前正在研究类似的解决方案。我有一个程序,我需要知道它是否没有运行,是否不工作,等等。但是如果我使用另一个程序来自动检查,那么第二个程序不会失败,也不会让我错过第一个程序失败的事实。不幸的是,我还没有一个好的概念解决方案。当然,看门狗是最强大、使用最广泛的解决方案之一。我会花几天时间仔细考虑,然后告诉你。当然,看门狗是最强大、使用最广泛的解决方案之一。我会花几天时间仔细考虑,然后告诉你。