如果 Unix 作业发生故障,它会自动重新启动吗?

use*_*798 2 unix services reboot cron

我有一个工作,我想在 Unix 上“守护”它:我希望它在计算机启动时出现,并且我希望它在出现故障时重新启动。

一个简单的方法是设置一个每 10 或 20 分钟运行一次的 cronjob。如果应用程序尚未运行,则 cronjob 应重新启动该应用程序。

我如何编写脚本的最后一部分:“如果作业当前未运行,则启动作业”?

小智 5

我为此目的使用Monit,它是免费且开源的。它可以满足您的需求,甚至更多。

莫尼特可以做什么

Monit 可以在进程没有运行时启动它,在进程没有响应时重新启动进程,在进程使用过多资源时停止进程。您可以使用 Monit 监视文件、目录和文件系统的更改,例如时间戳更改、校验和更改或大小更改。您还可以监控远程主机;Monit 可以 ping 远程主机并检查 TCP/IP 端口连接和服务器协议。Monit 通过易于使用的控制文件进行控制,该控制文件基于自由格式、面向令牌的语法。Monit 记录到 syslog 或其自己的日志文件,并通过可自定义的警报通知您有关错误情况和恢复状态的信息

我也很喜欢他们的设计理念:

对于系统监控工具来说,始终正常工作非常重要,您应该相信它能够做到这一点。系统监控工具必须是非侵入式的,并且一旦安装,您应该能够忘记它。也就是说,直到 sshd 在 50 英里外的同地服务器上挂掉。发生这种情况时,很高兴知道您已经安装了这一额外的安全和保护层 - 只需等待几秒钟,Monit 将重新启动 sshd 守护进程。在服务器磁盘已满之前或者您的 http 服务器突然出现斜线时,收到警报邮件也很有帮助。

Monit 被设计为一个自治系统,不依赖插件或任何特殊库来运行。相反,它开箱即用,可以利用系统上现有的基础设施。例如,Monit 将轻松与 init 集成,并可以使用现有的运行级别 rc 脚本来管理服务。当您需要对服务进行某种设置时,对于那些特殊情况也具有灵活性。

Monit 可在大多数 UNIX 版本上编译和运行。这是一个小程序,大小只有 300kB 多一点。如果您需要更小,则支持使用 glibc 替代品(例如 uClibc)进行编译。


由于您没有 root 访问权限,因此这样的脚本可能会满足您的要求:

“如果作业当前未运行,则启动该作业”

if [ $(ps ax | grep -v grep | grep "/usr/local/apache2/bin/httpd" | wc -l) -eq 0 ]
then
        echo "httpd Service not running"
        apachectl start
fi
Run Code Online (Sandbox Code Playgroud)

上面的代码是我用 cron 和 Apache httpd 守护进程创建和测试的。它只是在当前进程列表中搜索您的字符串。如果发现 0 行,则它未运行,因此它将重新启动。确保包含此内容grep -v grep以从流程输出中消除您的搜索。尝试使用二进制文件的完整路径,以确保它是您的查询中找到的服务。如果您只使用httpd例如,那么httpd.conf在 vim 中打开将使程序认为 httpd 服务正在运行,但实际上并未运行。当然,您启动服务的方法也会有所不同。


jti*_*man 5

如果您的程序在前台运行,请使用 Gerrit Pape 的runit。好处:

  • 它的防弹功能非常好(基于 Dan Berstein 的 daemontools)。
  • 它运行在各种平台上(便携式)。
  • 它打包在 Ubuntu 和 Debian 上(连同上面的..)。
  • 配置起来相对容易(运行脚本、日志脚本、一些符号链接)。