Shell Daemon程序监控宕掉的ES-HEAD插件

针对ES-Head插件频繁宕机问题,本文分享了一个用于监控并自动重启ES-Head服务的Shell脚本,确保服务的稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景说明

最近监控到新安装的es集群的head服务经常挂掉,导致http://ip:9100 UI页面打不开。
检查了es集群没有问题,却发现启动head的npm grunt服务异常挂掉(es高版本后,默认使用npm的grunt服务启动web服务),查询了下日志暂未发现任何问题,于是打算写一个grunt服务异常故障重启shell脚本临时过渡一下。

相关代码

es_head_self_restart.sh

#!/bin/sh
# Author: angelfish
# Desc: a daemon program for pull and restart the downed ES-HEAD plugin.

curr_time=$(date "+%Y-%m-%d %H:%M:%S")
start_command='/usr/local/elasticsearch-head/node_modules/grunt/bin/grunt server &'

while :

echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Current time is: '$curr_time

do
curr_time=$(date "+%Y-%m-%d %H:%M:%S")
echo ">> Current path is: " $PWD
runningStatus=$(ps -ef|grep "grunt"|grep -v "grep")
if [ "$runningStatus" ]; then
echo "Npm grunt server for es-head plugin was already started"
echo "here we do nothing"
echo '************************* $runningStatus : '$runningStatus
else
echo "Detected that grunt server was down, will attempt start it again."
#$start_command
/usr/local/elasticsearch-head/node_modules/grunt/bin/grunt server &
fi
sleep 30
done

grep + awk相关获取任务进程号方法

[es_deployman@balabala-50 elasticsearch-head]$ ps -ef|grep grunt|grep -v grep|awk -F ‘\s+’ ‘{print $0}’
es_depl+ 12954 12946 0 12:04 pts/0 00:00:01 grunt

[es_deployman@balabala-50 elasticsearch-head]$ ps -ef|grep grunt|grep -v grep|awk -F ‘\s+’ ‘{print $1}’
es_depl+

[es_deployman@balabala-50 elasticsearch-head]$ ps -ef|grep grunt|grep -v grep|awk -F ‘\s+’ ‘{print $2}’
12954

一些想法

关于启动方式:
1、可以以nohup方式启动该daemon脚本,如下:nohup es_head_self_restart.sh >> es_head_self_restart.sh.out &
2、crontab方式方式启动定期检查状态,这时可将shell 脚本里的sleep 语句去掉;

<think>嗯,用户遇到了Docker启动容器的问题,错误信息是关于网络配置失败的。首先,我需要理解错误的具体内容。错误提示提到“failed to set up container networking”,特别是关于网桥端口状态的问题,网桥端口在200毫秒后没有转发。这可能涉及到Docker的网络配置或者宿主机的网络设置。 首先,我应该考虑常见的解决方法。比如,重启Docker服务通常能解决一些临时性的问题,或者重启宿主机。接着,检查Docker的网络配置是否正确,特别是网桥的设置。用户可能使用的是默认的bridge网络,或者自定义网络,这时候需要确认网络是否存在冲突或者配置错误。 另外,错误中提到了veth设备,这涉及到Linux的虚拟网络设备。veth设备对可能没有正确建立,或者相关的iptables规则阻止了流量转发。需要检查防火墙设置,确保没有阻止Docker相关的流量。此外,检查内核参数中的网络转发是否启用,比如net.ipv4.ip_forward是否为1。 还有可能是Docker的网络驱动问题,尝试清理已有的网络资源,使用docker network prune命令,然后重新创建容器。如果问题依旧,可能需要重建Docker的网络环境,比如删除并重新初始化Docker的网络栈。 如果以上步骤都不奏效,可能需要更深入地检查宿主机的网络状态,比如使用brctl检查网桥状态,确认veth设备是否正确连接到网桥,或者查看系统日志(如journalctl或dmesg)中是否有更多相关错误信息。 最后,如果用户使用的是特定版本的Docker,可能存在已知的bug,建议升级Docker到最新版本,或者查看社区是否有类似的问题和解决方案。</think>以下是分步解决方案: ### 错误分析 该错误表明Docker在启动容器时无法正确配置网络接口,主要原因可能包括: 1. 宿主机的网络配置异常 2. Docker网络驱动问题 3. 网桥端口状态未就绪 4. 防火墙或内核参数限制 ### 解决方法 #### 第一步:基础网络修复 ```bash # 重启Docker服务 sudo systemctl restart docker # 重启宿主机网络服务(Ubuntu/CentOS) sudo systemctl restart network-manager # Ubuntu sudo systemctl restart NetworkManager # CentOS # 检查网络转发状态 sysctl net.ipv4.ip_forward # 如果返回0,需要启用: sudo sysctl -w net.ipv4.ip_forward=1 ``` #### 第二步:清理Docker网络资源 ```bash # 停止所有容器 sudo docker stop $(sudo docker ps -aq) # 清理无效网络 sudo docker network prune # 删除现有网络接口(慎用) sudo ip link delete docker0 sudo systemctl restart docker ``` #### 第三步:检查网桥配置 ```bash # 安装网桥工具 sudo apt-get install bridge-utils # Debian/Ubuntu sudo yum install bridge-utils # CentOS/RHEL # 查看网桥状态 brctl show # 预期应该看到类似以下输出: bridge name bridge id STP enabled interfaces docker0 8000.0242f17f3e2e no veth43286bb ``` #### 第四步:防火墙设置(关键步骤) ```bash # 检查iptables规则 sudo iptables -L -n -v # 添加Docker相关规则 sudo iptables -I FORWARD -i docker0 -j ACCEPT sudo iptables -I FORWARD -o docker0 -j ACCEPT # 持久化保存规则(Ubuntu) sudo netfilter-persistent save ``` #### 第五步:重建容器网络 ```bash # 删除旧容器(确保已备份数据) sudo docker rm elasticsearch-head # 使用明确网络参数重新创建 sudo docker run -d \ --name elasticsearch-head \ --network bridge \ -p 9100:9100 \ mobz/elasticsearch-head:latest ``` ### 高级排查 如果仍存在问题,尝试以下方法: 1. 升级Docker到最新版本 2. 检查内核日志: ```bash dmesg | grep -i veth journalctl -u docker.service --since "10 minutes ago" ``` 3. 禁用SELinux(临时测试): ```bash sudo setenforce 0 ``` ### 预防措施 建议在docker-compose.yml中配置健康检查: ```yaml version: '3' services: elasticsearch-head: image: mobz/elasticsearch-head:latest networks: - es-net healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9100"] interval: 30s timeout: 10s retries: 3 networks: es-net: driver: bridge driver_opts: com.docker.network.bridge.name: br-es ``` 这些步骤应能解决90%以上的同类网络问题。如果问题持续,请提供以下信息以便进一步诊断: 1. `docker info` 输出 2. `ip addr show` 结果 3. 完整的容器创建命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值