繁体   English   中英

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

[英]How to ensure that a program is running and restart it if needed?

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

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

提前致谢

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

我认为最简单的方法是使用一个脚本来启动你的程序,如果它返回它只是重新启动它。

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

Monit可以做你想做的事情等等。

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

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

  1. 使用OS基础设施(如solaris上的smf / svc,Ubuntu上的upstart等)。 这是正确的方法,因为您可以随时停止/重启/启用/禁用/重新配置。

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

launchtool是我用于此目的的程序,它将监视您的进程并根据需要重新启动它,它还可以在重新分配之前等待几秒钟。 如果在应用程序重新启动之前需要释放套接字,这可能很有用。 这对我的目的非常有用。

如果脚本每隔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正在运行goto END:Process_NotFound echo记事本未运行shutdown / r / t 50转到END:END

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

但是,程序可能会做一些事情。 您可能不仅希望检查应用程序是否正在运行,而且它还没有挂起或正在提供它想要的服务。 这可能意味着运行某种探测或综合事务来检查它是否正常运行。

编辑:您可以让init为您执行此操作 - 在inittab中为其提供一种“respawn”。 从手册页:

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

这不是那么容易的。 如果您正在考虑“我知道,我会编写一个程序来监视我的程序,或者查看这样的程序是否已作为标准服务存在!” 如果有人杀了那个节目怎么办? 谁看守望者?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM