【问题标题】:Cronjob to check and restart service if deadCronjob 检查并在死机时重新启动服务
【发布时间】:2016-04-28 04:13:42
【问题描述】:

我想要一个可以检查和重新启动服务的 1 班轮,例如 Apache 是否处于非活动/死机状态。

我想把它放在 crontab 中,每分钟运行一次,以确保服务仍在运行。

【问题讨论】:

  • 不要。使用监控工具(如monitsupervisordrunitsystemd 或其他任何一个)。
  • @EtanReisner systemd 支持看门狗(如果没有发送到 systemd,则重新启动服务),但如果 check-service-alive-script 失败,它不会重新启动服务:: lists.freedesktop.org/archives/systemd-devel/2016-May/… “这真的超出了 systemd 的范围。那是监控,我不相信在 systemd 中支持自定义检查功能真的合适,这真的应该在 systemd 之外实现。”
  • @guettli 很有趣。这对我来说似乎是一根非常小的头发,但是。
  • @EtanReisner 请详细说明。我只能猜你的意思——我不喜欢猜:-)
  • @guettli 我的意思是声称在“活动”失败(和其他退出)和其他(基于检查的)条件下重新启动之间存在有意义的差异。是的,这是有区别的,但是如果(根据线程中的下一篇文章)“[a] 管理员通常会创建类型计时器单元”来进行这种排序或监控,那么他们显然会将其视为可以轻松内置的需求。 (但我不是系统开发人员,所以我的意见并不重要。)

标签: linux bash centos crontab


【解决方案1】:

如果您将其保存为 bash 脚本,它将是您可以从 cron 调用的单行代码。如果 Apache 不在 pgrep 返回的进程列表中,这将重新启动它。

显然,这假设您有 pgrep。调整您的命令以相应地重新启动。

如果 Apache 正在运行但没有响应,这是一个不同的问题。您必须检查某个端点是否在指定的超时时间内响应(并正确响应)等。

#!/bin/bash

RESTART="/etc/init.d/httpd restart"
PGREP="/usr/bin/pgrep"
HTTPD="httpd"

$PGREP ${HTTPD}

if [ $? -ne 0 ] # if apache not running 
then
 # restart apache
 $RESTART
fi

【讨论】:

  • /etc/init.d/ 迟早会消失。
【解决方案2】:

service_ck.sh

#!/bin/bash
STATUS=$(/etc/init.d/service_name status)
# Most services will return something like "OK" if they are in fact "OK"
test "$STATUS" = "expected_value" || /etc/init.d/service_name restart

更改文件权限:

chmod +x service_ck.sh

更新你的 crontab:

# min   hour    day month   dow cmd
*/1 *   *   *   *   /path/to/service_ck.sh

【讨论】:

  • /etc/init.d/ 迟早会消失。
  • 没错,但目前systemdinit.d 映射到它的服务非常好,直到它完全取代sysvinit.dstart/stop 脚本将会并且应该存在并茁壮成长。
  • @NarūnasK 应该在有限的生命周期内生存和发展,直到不再支持折旧的模式/路径/方法。此外,还有这个:something.service is not a native service, redirecting to systemd-sysv-install。从技术上讲,虽然它熟悉且向后兼容,但它在现代安装中令人困惑和支离破碎 - 没有以 systemd 方式进行符号链接,没有出现在正确的列表/位置等。顺便说一句,你不需要这个脚本/cron at如果您使用 systemd 内置的自动重启功能:Restart=always,从现在开始,几乎所有发行版都应该可以使用它。
【解决方案3】:

对于这种情况,您可以使用monit 等特殊软件。它可以检查您的守护进程,在需要时重新启动它并向您发送警报。另一个不错的选择——它可以stop在 N 失败后尝试重新启动服务(例如,如果服务无法启动)。

【讨论】:

  • 看起来很有用,但如果您为这个monit 工具提供一些手册或文档会非常好。你能添加一些链接吗?因为我试图自己寻找一些东西,但没有成功。
  • 这个解决方案对您有用吗? luciusodioSeva Kobylin
【解决方案4】:

很抱歉唤醒了一个睡眠线程,但由于许多答案不再有效,我在查找时发现了这个页面,我想我应该在这里添加我的解决方案:

创建脚本check_service.sh 并根据需要设置SERVICENAME

#!/bin/bash

SERVICENAME="WHATEVER_SERVICE_YOU_WANT"

systemctl is-active --quiet $SERVICENAME
STATUS=$? # return value is 0 if running

if [[ "$STATUS" -ne "0" ]]; then
        echo "Service '$SERVICENAME' is not curently running... Starting now..."
        service $SERVICENAME start
fi

使脚本可执行:

chmod +x check_service.sh

最后,通过运行 sudo crontab -e 将脚本添加到 Root 的 crontab:

# min   hour    day month   dow cmd
*/1 *   *   *   *   /full/path/to/check_service.sh

保存 crontab,耐心等待!

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 2023-03-03
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多