使用 Healthchecks.io 监控 SystemD 服务

Lobsters Hottest 工具

摘要

本文介绍如何通过集成 Healthchecks.io 来监控 systemd 服务,利用 OnSuccess 和 OnFailure 钩子在服务状态变化时向其发送 ping 请求,并提供代码示例以及改进日志记录的相关更新。

<p><a href="https://lobste.rs/s/dxfl0r/monitoring_systemd_services_with">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/08/16 13:55

# 使用 Healthchecks.io 监控 SystemD 服务 来源:https://passbe.com/2022/healthchecks-io-systemd-checks/ **注意:我目前使用的是本页底部更新后的 SystemD 服务文件。** 技术环境中总会出现问题,这是不可避免的。我需要一个简单的方法来监控定时任务。这些任务大多是通过 SystemD 定时器生成的 SystemD 服务。 在研究相关系统时,我发现了 healthchecks.io(https://healthchecks.io/),它允许你自建实例。接下来需要在 SystemD 服务状态改变时触发一个 ping。为此,我利用了 `OnSuccess/OnFailure` 钩子与一些自定义服务。 一个我监控的服务文件示例: ``` [Unit] Description=示例服务 OnFailure=[email protected] OnSuccess=[email protected] [Service] ExecStart=/bin/bash -c 'exit 0' Type=oneshot [Install] WantedBy=multi-user.target ``` 我们为 `[email protected]` 和 `[email protected]` 都传递了 ping 的 UUID 作为参数。这些服务只需运行 `curl` 命令来 ping healthchecks.io 实例: ``` /etc/systemd/system/[email protected]: [Unit] Description=Ping healthchecks (%i) [Service] ExecStart=/bin/bash -c 'curl -s "https://localhost:8000/ping/%i/fail"' Type=oneshot [Install] WantedBy=multi-user.target /etc/systemd/system/[email protected]: [Unit] Description=Ping healthchecks (%i) [Service] ExecStart=/bin/bash -c 'curl -vv "https://localhost:8000/ping/%i"' Type=oneshot [Install] WantedBy=multi-user.target ``` 结合 healthchecks.io 提供的集成功能,现在当出现问题时我会收到通知。我偏好这种设置的简洁性,因为它可以与其他工具集成,例如我用于机器备份的 Vorta (https://vorta.borgbase.com/) / borg (https://www.borgbackup.org/): Vorta Post Hook 未来我可能会考虑附加日志,或尝试迁移到单个 healthcheck 服务。 ### 2023-01-18 更新 根据同事的反馈,我现已使用更新后的 SystemD 模板服务文件。 ``` [Unit] Description=Ping healthchecks (%i) [Service] ExecStart=/bin/bash -c 'IFS=: read -r UUID ACTION <<< "%i"; if [ "$ACTION" = "start" ]; then LOGS="" && EXIT_CODE="start"; else LOGS=$(journalctl --no-pager -n 50 -u $MONITOR_UNIT) && EXIT_CODE=$MONITOR_EXIT_STATUS; fi && curl -fSs -m 10 --retry 3 --data-raw "$LOGS" "https://localhost:8000/ping/$UUID/$EXIT_CODE"' Type=oneshot [Install] WantedBy=multi-user.target ``` 这允许我使用同一个模板文件,同时支持 Healthchecks.io 的启动和日志记录选项: ``` [Unit] Description=关键服务 OnFailure=healthcheck@deda567a-21e0-4744-ba9e-603c51e258b0:failure.service OnSuccess=healthcheck@deda567a-21e0-4744-ba9e-603c51e258b0:success.service Wants=healthcheck@deda567a-21e0-4744-ba9e-603c51e258b0:start.service ``` 其中的 `:failure`、`:success` 和 `:start` 部分很重要,因为没有它们,`$MONITOR_*` 环境变量将无法传递到服务中。请参阅手册中的这段引文(https://www.freedesktop.org/software/systemd/man/systemd.exec.html): > `$MONITOR_SERVICE_RESULT`、`$MONITOR_EXIT_CODE`、`$MONITOR_EXIT_STATUS`、`$MONITOR_INVOCATION_ID`、`$MONITOR_UNIT` 仅为服务单元类型定义。这些环境变量会传递给由 `OnFailure=` 或 `OnSuccess=` 依赖关系触发的服务中所有运行的 `ExecStart=` 和 `ExecStartPre=` 进程。变量 `$MONITOR_SERVICE_RESULT`、`$MONITOR_EXIT_CODE` 和 `$MONITOR_EXIT_STATUS` 的值与 `ExecStop=` 和 `ExecStopPost=` 进程的值相同。变量 `$MONITOR_INVOCATION_ID` 和 `$MONITOR_UNIT` 被设置为触发该依赖的服务的调用 ID 和单元名称。请注意,当多个服务触发同一个单元时,这些变量将不会被传递。请考虑使用模板处理单元来应对这种情况:对于非模板单元,使用 `"OnFailure=handler@%n.service"`;对于模板单元,使用 `"OnFailure=handler@%p-%i.service"`。

相似文章

构建时 systemd 调度

Lobsters Hottest

文章探讨了使用 NixOS 来检查和管理自托管服务的构建时 systemd 调度,以增强运行时检查。

你对 systemd 定时器的爱还不够

Lobsters Hottest

本文提倡在 Linux 上使用 systemd 定时器替代传统的 cron 作业来执行定时任务,强调其更好的集成性、日志记录以及更清晰的语法。

Openstatus MCP Health Checker

Product Hunt

Openstatus MCP Health Checker 让您像真实的 AI 客户端一样测试 MCP 服务器,而不仅仅是简单的 ping。