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

7
我有一个运行嵌入式Linux的系统,它需要持续运行。基本上,它是一个用于与传感器通信并将数据传递到数据库和Web客户端的进程。
如果发生崩溃,如何自动重新启动应用程序?
此外,有几个线程正在进行轮询(例如套接字和串口通信)。如何确保没有任何线程被卡住或意外退出?是否有一个易于使用的看门狗可以支持多线程?
4个回答

7
你可以使用fork和waitpid无缝地重新启动进程,如此答案所述。由于操作系统将共享内存页面,因此不会消耗任何显著的资源。
这只留下了检测挂起进程的问题。您可以使用Michael Aaron Safyan提出的任何解决方案来解决此问题,但更简单的解决方案是重复使用alarm系统调用,使信号终止进程(相应地使用sigaction)。只要您不断调用alarm(即只要您的程序在运行),它就会继续运行。一旦你停止调用,信号就会触发。
这样,不需要额外的程序,只使用可移植的POSIX内容。

6
要点如下:
1. 检测程序是否仍在运行且未挂起。 2. 如果程序未运行或挂起,需要重新启动程序。
有许多不同的方法可以完成第一步,但是其中两种方法是:
1. 监听UNIX域套接字以处理状态请求。然后外部应用程序可以查询应用程序是否仍然正常。如果在某个超时期间内没有收到响应,则可以假定正在查询的应用程序已死锁或已停止。 2. 定期触摸具有预选路径的文件。外部应用程序可以查看文件的时间戳,如果过时,则可以假定该应用程序已死亡或死锁。
关于第二步,杀死先前的PID并使用fork + exec启动新进程是典型的。您还可以考虑将连续运行的应用程序转换为只运行一次的应用程序,然后使用“cron”或其他应用程序来持续重新运行该单次运行应用程序。

很遗憾,看门狗定时器和解决死锁问题都不是简单的问题。我不知道有什么通用的方法来解决它,而且我见过的少数方法相当丑陋,也不能保证百分之百无错。然而,tsan 可以通过静态分析帮助检测潜在的死锁场景和其他线程问题。


有没有什么开箱即用的守护进程可以监视其他守护进程并重新启动它们?哈哈 - user623879
1
在许多嵌入式平台上,您可以让看门狗守护进程激活硬件看门狗,确保看门狗不会失效。 - Hasturkun
我想赞同“调整您的应用程序,使其仅运行一次,然后重复运行该单次运行应用程序”的建议。如果可能的话,这将显着简化检测过程。 - Brooks Moses

1
您可以创建一个CRON作业,定期使用start-stop-daemon检查进程是否正在运行。

0

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

#!/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”之间至少放置一条指令。 - Matthieu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接