Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux在崩溃守护进程上自动重新启动应用程序_C_Linux_Embedded_Watchdog - Fatal编程技术网

C Linux在崩溃守护进程上自动重新启动应用程序

C Linux在崩溃守护进程上自动重新启动应用程序,c,linux,embedded,watchdog,C,Linux,Embedded,Watchdog,我有一个运行嵌入式linux的系统,它连续运行是至关重要的。基本上,这是一个与传感器通信并将数据转发到数据库和web客户端的过程 如果发生崩溃,如何自动重新启动应用程序 此外,还有几个线程进行轮询(例如套接字和uart通信)。如何确保没有线程意外挂起或退出?是否有一个易于使用且线程友好的看门狗?其要点是: 您需要检测程序是否仍在运行且未挂起 如果程序未运行或挂起,则需要(重新)启动程序 有许多不同的方法可以做到#1,但我想到的两种方法是: 侦听UNIX域套接字以处理状态请求。然后,外部应用程序可

我有一个运行嵌入式linux的系统,它连续运行是至关重要的。基本上,这是一个与传感器通信并将数据转发到数据库和web客户端的过程

如果发生崩溃,如何自动重新启动应用程序

此外,还有几个线程进行轮询(例如套接字和uart通信)。如何确保没有线程意外挂起或退出?是否有一个易于使用且线程友好的看门狗?

其要点是:

  • 您需要检测程序是否仍在运行且未挂起
  • 如果程序未运行或挂起,则需要(重新)启动程序
  • 有许多不同的方法可以做到#1,但我想到的两种方法是:

  • 侦听UNIX域套接字以处理状态请求。然后,外部应用程序可以查询应用程序是否仍然正常。如果在某个超时时间段内没有收到响应,则可以假定所查询的应用程序已死锁或已死亡

  • 定期接触具有预选路径的文件。外部应用程序可以查看文件的时间戳,如果文件已过时,则可以假定应用程序已死机或死锁

  • 关于#2,典型的做法是取消以前的PID并使用fork+exec启动新流程。您还可以考虑将应用程序“连续运行”到运行一次的应用程序中,然后使用“CRON”或其他应用程序继续重新运行单个运行的应用程序。
    不幸的是,看门狗定时器和摆脱死锁都是非常重要的问题。我不知道有什么通用的方法可以做到这一点,而且我见过的少数几个方法非常丑陋,而且不是100%没有bug。但是,通过静态分析可以帮助检测潜在的死锁场景和其他线程问题。

    您可以在进程死机时使用
    fork
    waitpid
    无缝地重新启动进程,如前所述。因为操作系统将共享内存页,所以它不需要花费任何重要的资源

    这只剩下检测挂起进程的问题。您可以使用Michael Aaron Safyan为此指出的任何解决方案,但更简单的解决方案是反复使用
    报警
    系统调用,让信号终止进程(相应地使用sigaction)。只要您继续调用
    报警
    (即只要您的程序正在运行),它就会继续运行。如果不这样做,信号就会发出。

    这样,就不需要额外的程序,只使用可移植的POSIX工具。

    您可以创建一个CRON作业来检查进程是否不时使用启动-停止守护进程运行。

    使用此脚本运行您的应用程序

    #!/bin/bash
    
    while ! /path/to/program   #This will wait for the program to exit successfully.
    do
    echo “restarting”                  # Else it will restart.
    done
    

    您也可以将此脚本放在您的
    /etc/init.d/
    中,以其他方式启动守护进程

    任何开箱即用的守护进程来监视守护进程并重新启动它们哈哈?在许多嵌入式平台上,您可以让您的看门狗守护进程生成硬件看门狗,确保看门狗不会死掉。我想附和您的建议“调整应用程序,使其只运行一次,然后重复运行该单次运行的应用程序。”如果可能,这将大大简化检测过程。并确保在
    do
    done
    之间至少放置一条指令。