我一直在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文件.