如果 Systemd 没有监听端口,则重新启动服务

如果 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

此脚本使用 cron 定期触发。我知道这是一个卑鄙的伎俩。这就是为什么我想将该行为集成到 Systemd 检查中。这可能吗?

先感谢您。

干杯,

A。

答案1

我建议您采用不同的方法并使用专用的监控工具来实现这一点。

我最喜欢的监控工具是,它允许在服务崩溃或不再监听其配置的端口时重新启动服务。监控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

你可以省略协议 httppart 和 monit 将只进行简单的 tcp 连接来测试。协议参数进行更复杂的测试来检查某些东西是否真正响应,例如 http get 请求。

您需要确保进程或服务以相应的方式启动pid 文件在 /var/run 中创建。Monit 本身不负责处理这一点。通常,如果服务是通过 init 脚本或 systemd 启动的,它应该有一个pid 文件在 /var/run 中。

相关内容