Linux在崩溃时自动重启应用程序 – 守护进程

我有一个运行embedded式Linux的系统,它是连续运行的关键。 基本上,这是一个与传感器进行通信并将数据转发到数据库和Web客户端的过程。

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

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

Solutions Collecting From Web of "Linux在崩溃时自动重启应用程序 – 守护进程"

其要点是:

  1. 您需要检测程序是否仍在运行,而不是挂起。
  2. 如果程序没有运行或挂起,您需要(重新)启动程序。

有许多不同的方式来做#1,但想到两个是:

  1. 监听UNIX域套接字来处理状态请求。 然后外部应用程序可以询问应用程序是否仍然正常。 如果在某个超时时间内没有得到响应,则可以认为被查询的应用程序已经死锁或者死机。

  2. 定期用预先选择的路径触摸文件。 外部应用程序可以查看该文件的时间戳,如果该文件是陈旧的,则可以认为该应用程序已经死机或死锁。

关于#2,杀死以前的PID并使用fork + exec来启动一个新的进程是典型的。 您也可以考虑将您的应用程序“连续”运行到运行一次的应用程序中,然后使用“cron”或其他应用程序连续重新运行该单一应用程序。

不幸的是,看门狗定时器和走出僵局是不平凡的问题。 我不知道有什么通用的方法可以做到这一点,而我所看到的少数几个相当丑陋,并且不是百分之百无bug的。 但是,通过静态分析, tsan可以帮助检测潜在的死锁情况和其他线程问题。

您可以无缝地重新启动您的进程,因为它在forkwaitpid死去,如本答案中所述 。 它不会花费任何重要的资源,因为操作系统将共享内存页面。

这只留下检测挂起进程的问题。 您可以使用Michael Aaron Safyan指出的任何解决方案,但更容易的解决方案是反复使用alarm系统调用,使信号终止进程(相应地使用sigaction)。 只要你一直呼叫alarm (即只要你的程序正在运行),它将继续运行。 一旦你没有,信号会发射。
这样,不需要额外的程序,只有便携POSIX的东西使用。

您可以创建一个CRON作业,以检查进程是否随时使用start-stop-daemon运行。

使用这个脚本来运行你的应用程序

 #!/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/中作为守护进程启动