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