linux – 如果没有监听端口,则为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检查中集成该行为的原因.那可能吗?

先感谢您.

干杯,

一个.

解决方法

我建议你采用不同的方法,并使用专用的监控工具来实现这一目标.

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

你可以省略协议http部分,monit将只做一个简单的tcp连接来测试它. protocol参数执行更复杂的测试,以检查某些内容是否实际响应,例如,http get请求.

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

相关文章

/etc/sysctl.conf这个目录主要是配置一些系统信息,/etc/sys...
1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起...
它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅...
不管是我们在安装软件还是监测软件的使用性能,我们都要随时...
装好Tomcat7后,发现除了本机能访问外界访问不了,岂有此理。...
修改防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,...