使用 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 作业来执行定时任务,强调其更好的集成性、日志记录以及更清晰的语法。