Adr*_*nez 5 linux monitoring debian systemd
我已经在 Debian 8 中使用 Systemd 一段时间了。我使用 Restart=on-failure 选项在出现故障时唤醒服务。
我想知道如果服务没有侦听特定端口(即使进程仍在运行),是否有办法强制重新启动服务。
我需要它的原因是因为我们正在开发新功能来解决这个问题,但这需要一段时间。同时,我们需要一个解决方法。
我开发了一个脚本来检查该状态:
#! /bin/bash
PORTS=( 1452 542 )
for port in ${PORTS[@]}; do
netstat -anp | grep $port > /dev/null 2>&1
if [ "$?" -ne 0 ]; then
# Port blocked. Kill the running process and start it again after a while
done
Run Code Online (Sandbox Code Playgroud)
这个脚本是使用 cron 定期触发的。我知道这是一个肮脏的把戏。这就是为什么我想在 Systemd 检查中集成该行为。那可能吗?
先感谢您。
干杯,
一种。
我建议您以不同的方式处理它并使用专用的监视工具来完成此操作。
我最喜欢的监控工具是monit:https : //packages.debian.org/jessie/monit
配置文件、本站点和其他地方有很多关于设置的示例。我将列出一个示例,让您了解它的使用有多简单,该示例使用 init.d 但它可以轻松转换为使用 systemd。
要测试进程是否存在并正在侦听特定端口并在此测试失败时启动它:
check process example with pidfile /var/run/example.pid
start program = "/etc/init.d/example start"
start program = "/etc/init.d/example stop"
if failed host 192.0.2.10 port 80 protocol http then restart
if 5 restarts within 5 cycles then timeout
Run Code Online (Sandbox Code Playgroud)
您可以省略协议 http部分,monit 将只执行一个简单的 tcp 连接来测试它。该协议的说法做了更复杂的测试,以检查是否东西实际上响应,例如,HTTP GET请求。
您需要确保以在 /var/run 中创建相应pid 文件的方式启动进程或服务。Monit 本身并不关心这个。通常,如果服务是通过 init 脚本或 systemd 启动的,它应该在 /var/run 中有一个pid 文件。