如果 Unix 作业发生故障,是否自动重新启动?

如果 Unix 作业发生故障,是否自动重新启动?

我有一份工作,我想在 Unix 上进行“守护”:我希望它在计算机启动时启动,并且如果计算机崩溃了,我希望它重新启动。

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

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

答案1

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

Monit 可以做什么

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

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

系统监控工具始终正常工作非常重要,并且您应该能够信任它。系统监控工具必须是非侵入式的,并且一旦安装,您就应该能够忘记它。也就是说,直到 50 英里外的同地服务器上的 sshd 死机。当这种情况发生时,很高兴知道您已经安装了这一额外的安全和保护层 - 只需等待几秒钟,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

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

答案2

如果你的程序在前台运行,请使用 Gerrit Pape 的运行。 优点:

  • 它具有相当好的防弹能力(基于 Dan Berstein 的 daemontools)。
  • 它可以在多种平台上运行(便携式)。
  • 它在 Ubuntu 和 Debian 上打包(与上面一起..)。
  • 配置相对容易(运行脚本、日志脚本、一些符号链接)。

答案3

还有一些解决方案专门设计用于作为看门狗,甚至作为不创建 pid 文件等的服务脚本运行。此类解决方案的一个例子是导师

答案4

您可以使用 systemd。大多数现代系统都已使用它。

使用Type=Simple

Type=simple(默认):systemd 认为该服务会立即启动。进程不得分叉。如果需要在此服务上调用其他服务,请不要使用此类型,除非它是套接字激活的。

来源:https://wiki.archlinux.org/index.php/systemd#Service_types

Restart=always

请不要自己做分叉魔法,因为其他工具已经做到这一点(并且比你和我做得更好)。

相关内容