如何确保程序正在运行并在需要时重新启动它?

Posted

技术标签:

【中文标题】如何确保程序正在运行并在需要时重新启动它?【英文标题】:How to ensure that a program is running and restart it if needed? 【发布时间】:2009-04-24 12:08:16 【问题描述】:

我开发了一个需要持续运行的软件(用 C++ 编写)。这基本上意味着它每次停止时都必须重新启动。

我正在考虑使用 cron 作业每分钟检查一次它是否还活着,但可能有更清洁的方法或标准的方法来做这件事。

提前致谢

【问题讨论】:

【参考方案1】:

Fedora 和 Ubuntu 使用upstart,它可以在你的守护进程退出时自动重启它。

【讨论】:

【参考方案2】:

我相信最简单的方法是创建一个脚本来启动你的程序,如果它返回到它就重新启动它。

#!/bin/sh
while true; do
  ./Your_program
done

【讨论】:

我使用了这个技巧的一个更复杂的版本(我有一个 perl 脚本,它启动一组守护进程,同时注意启动依赖关系)。在实践中,一个足够简单的脚本(如给出的示例)不会失败,除非系统出现大问题。这不是万无一失的,但它很简单,除非系统在你周围崩溃,否则不太可能失败。 我否决了这个答案,因为虽然它可以为开发人员解决问题,但这是一个典型的案例,解决方案应该由知识渊博的系统管理员提供。如果你的程序在中间死掉会发生什么?如果需要的文件已被示例删除,这种情况并不少见。这个循环会破坏机器的性能,甚至有可能导致机器停机。这是系统管理员永无止境的循环。不要使用这个解决方案!【参考方案3】:

Monit 可以做你想做的事,甚至更多。

如果您的应用程序足够智能以检查自身是否正在运行(这是为了避免运行多个副本),那么 cron 是一个选项。这通常通过 PID 文件以标准方式完成。

【讨论】:

如果应用程序需要太多资源来开始运行,它就会变得过于繁重。 cron 方法对于轻量级应用很有用。【参考方案4】:

在 *nix 上有两种正确的方法:

    使用操作系统基础架构(如 Solaris 上的 smf/svc、Ubuntu 上的 upstart 等...)。这是正确的方法,因为您可以随时停止/重新启动/启用/禁用/重新配置。

    在 /etc/inittab 中使用“respawn”(在启动时启用)。

【讨论】:

在inittab中重生也解决了“谁看守望者”的问题。如果 init 死掉(或被杀死),系统将崩溃,因此您无需担心重新启动进程。 这是基础架构的任务。您有数百个进程的 一个 观察者(必要时将重新启动)。您不想因为一个进程而恐慌并使机器崩溃。【参考方案5】:

launchtool 是我用于此目的的一个程序,它会监视您的进程并根据需要重新启动它,它也可以在重新调用之前等待几秒钟。这在应用程序可以重新启动之前需要释放套接字的情况下很有用。这对我的目的非常有用。

【讨论】:

看来launchtool 没有为Fedora 打包,所以我怀疑它会在RedHat 中。【参考方案6】:

创建您希望作为“观察者”进程的子进程持续运行的程序,当它终止时会重新启动它。您可以使用 wait/waitpid(或 SIGCHILD)来判断孩子何时终止。我希望有人编写的代码可以做到这一点(这几乎就是 init(8) 所做的)

但是,该程序可能会做一些事情。您可能不仅要检查应用程序是否正在运行,还要检查它是否没有挂起或其他什么,并且正在提供它所要提供的服务。这可能意味着运行某种探测或合成事务以检查其是否正常运行。

编辑:您可以让 init 为您执行此操作 - 在 inittab 中给它一种“重生”类型。从手册页:

respawn
    The process will be restarted whenever it terminates (e.g. getty). 

【讨论】:

【参考方案7】:

让脚本每 10 分钟检查一次以查看应用程序是否正在运行,如果没有,它将重新启动计算机。如果应用程序正在运行,那么它会继续检查。

这是我的脚本,使用 PrcView 是一个免费的进程查看器实用程序。我使用 notepad.exe 作为需要运行的示例应用程序,我不确定每 10 分钟检查一次的命令以及它在我的脚本中的位置。

@echo 关闭 PATH=%PATH%;%PROGRAMFILES%\PV;%PROGRAMFILES%\记事本 PV.EXE notepad.exe >nul 如果 ERRORLEVEL 1 转到 Process_NotFound :Process_Found echo 记事本正在运行 转到END :Process_NotFound echo 记事本没有运行 关机 /r /t 50 转到END :END

【讨论】:

【参考方案8】:

这并不容易。如果你在想“我知道,我会写一个程序来监视我的程序,或者看看这样的程序是否已经作为标准服务存在!”那么如果有人杀死了那个程序呢?谁在看守望者?

【讨论】:

是的,我知道,这就是我问这个问题的原因 :-) 我暗暗希望 Linux 有这样的功能...... 第一个节目,所以他们互相看。是的,这仍然可以被击败,但这很棘手.. 如果你有“那个程序”在特定的权限下运行,你就不用担心有人杀了它。如果 root 杀死了它,那么他们可能需要这样做。 您显然从未听说过 Friar Tuck 和 Robin Hood (textfiles.com/virus/robin.hod)。 @Chas。 Owens ++ 精彩的故事。

以上是关于如何确保程序正在运行并在需要时重新启动它?的主要内容,如果未能解决你的问题,请参考以下文章

启动或确保延迟作业在应用程序/服务器重新启动时运行

调试时如何仅重新启动Apple Watch应用程序?

活动生命周期。当应用程序已经打开(折叠)正在关闭并在图标单击时重新启动?

有没有办法使用cron重新启动pm2进程但是只有它还没有运行?

sh 检查Pulseway服务并在未运行时重新启动它。登录到/var/log/pulseway.log

内核已死并在运行单元以训练回归模型时自动重新启动