代码之家  ›  专栏  ›  技术社区  ›  Enrico Carlesso

监视程序生命周期的最佳实践

  •  1
  • Enrico Carlesso  · 技术社区  · 14 年前

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

    情况就是这样。你有一个简单的程序 正常地

    如果你想确保这个程序正常运行,你将如何操作 ?

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

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

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

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

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

    3 回复  |  直到 14 年前
        1
  •  5
  •   Community CDub    5 年前

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

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

    因此,您的程序可能处于探测之下,您要做的就是周期性地编写一些带有epoch戳的programname\u看门狗文件。这将是常规循环的一部分。

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

    积极的

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

    问题 真正地 成为您对系统的期望值;什么样的故障是不可接受的,什么样的故障是预期的,这样您就可以对它们进行补偿。

    这个问题很快就成为了一个验证软硬件协同设计的问题(也很昂贵)。我很想知道你在做什么,你的解决办法是什么。

        2
  •  0
  •   Greg Buehler    14 年前

    就像保罗内森说的,用一只看门狗。

    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

        3
  •  0
  •   Enrico Carlesso    14 年前

    好。这个问题我想了很久,出现了两件事。

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

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

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