4

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

我正在考虑使用 cron 作业每分钟检查它是否还活着,但可能有一种更清洁的方式或标准的方式来执行此操作。

提前致谢

4

8 回答 8

9

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

于 2009-04-24T12:17:49.040 回答
6

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

#!/bin/sh
while true; do
  ./Your_program
done
于 2009-04-24T12:13:36.210 回答
4

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

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

于 2009-04-24T12:17:56.077 回答
4

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

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

  2. 在 /etc/inittab 中使用“respawn”(在引导时启用)。

于 2009-04-24T12:27:48.300 回答
2

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

于 2009-04-24T12:23:36.123 回答
1

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

但是,该程序可能会有所作为。您可能不仅要检查应用程序是否正在运行,还要检查它是否未挂起或其他任何东西,并且正在提供其预期的服务。这可能意味着运行某种探测或合成事务来检查它是否正常运行。

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

respawn
    The process will be restarted whenever it terminates (e.g. getty). 
于 2009-04-24T12:16:10.417 回答
1

每隔 10 分钟检查一次以查看应用程序是否正在运行的脚本怎么样,如果不是,它将重新启动计算机。如果应用程序正在运行,那么它只是继续检查。

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

@echo off PATH=%PATH%;%PROGRAMFILES%\PV;%PROGRAMFILES%\Notepad PV.EXE notepad.exe >nul if ERRORLEVEL 1 goto Process_NotFound :Process_Found echo Notepad is running goto END :Process_NotFound echo Notepad is not running shutdown / r /t 50 转到 END :END

于 2010-02-27T16:09:47.717 回答
0

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

于 2009-04-24T12:10:39.353 回答