Linux 应用程序监控工具

Linux 应用程序监控工具

我有一个 Java 应用程序(fat jar),它在 Linux Ubuntu 实例上运行,有时会失败。该应用程序嵌入了 Web 服务器并公开了健康检查 URL。

我需要通过安装在这个 Linux 机器上的一些工具实现某种外部监控,该工具会定期 ping 这个 URL 并在需要时重新启动 Java 应用程序。

你能告诉我它是如何实现的吗?

答案1

我怀疑你是否能找到一个可以完成所有这些功能的工具。

但是,这里有一些方法可以实现您想要的功能。您需要将 Java 应用设为 systemd 服务,安装一个可以 ping 您的健康检查 URL 的工具,并偶尔运行一个简单的 bash 脚本来运行该工具,检查其退出代码,如果它不是我们想要的,它将重新启动您的服务(systemd 负责处理所有子进程等)。

从你的 Java 应用程序中创建一个 systemd 服务:
创建一个文件/etc/systemd/system/<my-service>.service。将其替换<my-service>为您希望服务具有的任何名称。
通过配置以下内容来编辑文件:

[Unit]
Description=My java application
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/java -jar /path/to/my/jar # or whatever command  you use to start your application, make sure the paths are absolute (to find your java executable, run `whereis java`)
User=someuser # the user with which the application will run, can be root
StandardOutput=journal
StandardError=journal # you can configure where stdout/stderr go, you can use journal for easier logging

[Install]
WantedBy=multi-user.target

您需要编辑以下内容:
描述- 设置适合您的应用程序的描述(非必需)
类型- 如果您的应用程序分叉并运行子进程,那么您需要将类型设置为forking,这样 systemd 就会知道您分叉了子进程并且它也会管理它们。
执行开始- 用于启动应用程序的命令(带绝对路径)。您也可以将其设为 bash 脚本。

配置该文件后,您需要重新加载 systemd 的守护进程配置:
sudo systemctl daemon-reload

然后启用您的服务(如果您希望它在启动时自动启动):
sudo systemctl enable <my-service>.service
或者直接启动它:
sudo systemctl start <my-service>.service

恭喜,现在您的应用程序正在作为 systemd 服务运行。您可以在以下位置阅读有关创建、修改和管理自定义 systemd 服务的更多详细信息:此 Red Hat 文档

但我们还没有完成,下一步:
安装 ping 您的 URL 所需的工具并编写一个 bash 脚本来重新启动您的服务:
可以 ping 网址的工具是httping例如。您可以通过运行 将其安装在您的 Ubuntu 系统上sudo apt install httping
然后编写一个 bash 脚本,httping使用适当的参数调用并重新启动您的服务(如果出现问题)。类似于以下内容(一个非常基本的示例):

#!/bin/bash

httping -c 5 -g <url_for_health_check> -s

if [[ $? -eq 0 ]]; then
    echo "Health check is OK."
else
    echo "Health check is not OK.. restarting service."
    sudo systemctl restart <my_service>.service
fi

此 bash 脚本调用httping并 ping 健康检查 URL 5 次以获取其状态代码(-cping 次数,-gURL,-s状态代码)。当httping使用 调用时-s,除非 URL 的状态为 OK,否则它永远不会以 退出代码退出0。因此,如果它没有以 退出0,则存在问题,因此我们重新启动服务(即 if 检查)。

那么,我们完成了吗?我们现在有一个脚本,如果我们的服务(Java 应用程序)出现问题,它会重新启动它。但是,我们仍然需要随着时间的推移自动运行此脚本。

为此,您可以创建一个 cron 任务或使用systemd 定时器

使用 systemd 执行此操作的一个示例:
首先,你需要将你的 bash 脚本设置为服务,就像你的 Java 应用程序一样。不过这次要简单得多。

创建文件/etc/systemd/system/health_check.service并添加以下内容(当然是编辑路径):

[Unit]
Description=Health check bash script

[Service]
Type=oneshot
ExecStart=/bin/bash /path/to/bash/script.sh

然后创建一个systemd 定时器运行该服务:
创建/etc/systemd/system/health_check.timer并填充以下内容:

[Unit]
Description=Health check script timer
After=<my_service>.service

[Timer]
Unit=health_check.service
OnCalendar=minutely

[Install]
WantedBy=multi-user.target

在这里,您必须指定计时器必须始终在您监控的服务(替换<my_service>.service为您的 Java 应用程序服务)之后启动。并OnCalendar=指定何时运行计时器。目前,它将每分钟运行一次。您可以更改它,请参阅systemd.time更多细节。

差不多就这些了。现在只需启用计时器(不是 bash 脚本服务)并启动它,但也要先重新加载守护进程配置:

sudo systemctl daemon-reload 
sudo systemctl enable health_check.timer
sudo systemctl start health_check.timer

现在你应该准备好了。计时器将每 1 分钟启动一次你的 bash 脚本,它将检查健康检查 URL 是否正常,如果不正常,它将重新启动你的服务。

有一些更复杂的方法可以做到这一点,而不使用 bash 脚本,只有 systemd,但是,对于初学者来说,这应该可行。

笔记:这将设置一个完全自动的监控。无需手动干预,这就是您启用计时器的原因,这样它就可以与您的 Java 应用程序一起在启动时运行。如果您想手动完成所有操作,请不要启用这些服务,而仅在需要时启动它们。

参考:
systemd.service- systemd 服务单元的手册页,您可以阅读以了解什么是服务、如何使用它们以及如何配置它们。
systemd.定时器- systemd 计时器单元的手册页,用于了解计时器的工作原理以及如何配置它们。

相关内容