我在Debian 8中一直使用Systemd。我使用Restart = on-failure选项来唤醒服务,以防出现故障。
我想知道是否有办法强制重新启动服务,如果它没有监听特定的端口(即使进程仍在运行)。
我之所以需要这个原因是因为我们正在开发新的function来解决这个问题,但这需要一段时间。 同时我们需要一个解决方法。
我已经开发了一个脚本来检查这个状态:
#! /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检查中集成该行为的原因。 那可能吗?
先谢谢你。
干杯,
一个。
我build议你以不同的方式处理,并使用专门的监测工具来完成这一点。
我最喜欢的监视工具,允许服务在发生崩溃时重新启动,或者不再监听已configuration的端口, monit : https : //packages.debian.org/jessie/monit
在configuration文件中有很多例子,在这个站点和其他地方有关它的设置。 我将列举一个例子,给你一个想法是多么简单的使用,这个例子使用init.d,但它可以很容易地转换为使用systemd。
要testing进程是否存在,并且正在侦听特定端口并在此testing失败时启动该进程:
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连接来testing它。 协议参数做了一个更复杂的testing来检查是否有实际的响应,例如,http获取请求。
您需要确保进程或服务以这种方式启动,在/ var / run中创build相应的pid文件 。 Monit本身并不关心这一点。 通常,如果服务是通过init脚本或systemd启动的,它应该在/ var / run中有一个pid文件 。