监控的shell脚本阻塞

项目中用到的shell脚本,用来监控crond,ssh,thttpd几个进程的运行 ,若某一个进程异常,则立即重新启动。代码如下:

                ps aux | grep "\bcrond" > /dev/null 2>&1
                if [ $? -ne 0 ]; then
                        crond > /dev/null 2>&1 
                fi

                ps aux | grep "\bsshd" > /dev/null 2>&1
                if [ $? -ne 0 ]; then
                        /usr/sbin/sshd > /dev/null 2>&1 
                fi

                ps aux | grep "\bthttpd" > /dev/null 2>&1
                if [ $? -ne 0 ]; then
                        if [ -e /etc/thttpd.conf ]; then
                                /root/bin/thttpd -D -C /etc/thttpd.conf > /dev/null 2>&1
                        fi
                fi


但运行中发现有时候其中某一个进程异常退出后无法恢复,同时ps命令看到监测shell脚本正在运行,猜测脚本被“阻塞”。

通过查阅猜测shell脚本阻塞,原因可能是启动thttpd时候阻塞住了,进而阻塞了shell。



解决办法:若让thttpd后台执行,可以解决这个问题。

                ps aux | grep "\bthttpd" > /dev/null 2>&1
                if [ $? -ne 0 ]; then
                        if [ -e /etc/thttpd.conf ]; then
                                /root/bin/thttpd -D -C /etc/thttpd.conf > /dev/null 2>&1  &
                        fi
                fi

通过验证,果然如此。


为防止其他进程也出现累死的问题,也让其后台执行;

                ps aux | grep "\bcrond" > /dev/null 2>&1
                if [ $? -ne 0 ]; then
                        crond > /dev/null 2>&1  &
                fi

                ps aux | grep "\bsshd" > /dev/null 2>&1
                if [ $? -ne 0 ]; then
                        /usr/sbin/sshd > /dev/null 2>&1  &
                fi

                ps aux | grep "\bthttpd" > /dev/null 2>&1
                if [ $? -ne 0 ]; then
                        if [ -e /etc/thttpd.conf ]; then
                                /root/bin/thttpd -D -C /etc/thttpd.conf > /dev/null 2>&1  &
                        fi
                fi

问题解决。

<think>首先,用户的问题是关于使用Shell脚本监控特定网络报文的方法。我需要基于提供的引用信息来构建回答。 回顾引用: - 引用[1]:展示了一个监控端口的脚本,使用`ss`命令检查端口是否存在,如果不存在则重启服务。 - 引用[2]:是关于Linux shell脚本入门的博客。 - 引用[3]:展示了使用FIFO管道在主机间通信的脚本。 - 引用[4]:提到sed、grep和awk是文本处理工具。 - 引用[5]:关于使用shell脚本实现ssh登录报警。 用户想知道如何监控特定的网络报文。监控报文通常涉及网络流量分析,比如捕获和分析数据包。 在Shell脚本中,监控网络报文通常使用工具如`tcpdump`或`tshark`(Wireshark的命令行版本),结合脚本逻辑来处理输出。 关键点: - 使用`tcpdump`捕获报文。 - 过滤特定报文(如源IP、目的IP、端口、协议等)。 - 在脚本中分析捕获的数据。 - 可能触发警报或记录日志。 参考引用[1],它监控端口状态;引用[5]有报警机制。所以,我可以结合这些思路。 步骤: 1. **捕获报文**:使用`tcpdump`捕获网络流量。 2. **过滤特定报文**:通过`tcpdump`的过滤表达式指定感兴趣的报文。 3. **处理输出**:使用grep、awk等工具解析`tcpdump`的输出。 4. **监控和报警**:设置循环检查,如果检测到特定报文,则记录或报警。 示例脚本结构: - 使用`tcpdump`在后台运行。 - 解析其输出。 - 如果匹配条件,则行动。 系统级指令: - 所有行内数学表达式用$...$。 - 独立公式用$$...$$。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,如[^1]。 回答结构: - 清晰、逐步解释。 - 提供示例脚本。 - 确保真实可靠。 最终回答: 1. 介绍方法。 2. 给出示例脚本。 3. 解释关键部分。 4. 生成相关问题。 生成相关问题: - 基于主题,如优化、扩展应用等。</think>### Shell脚本监控特定网络报文的方法 监控特定网络报文(如基于源IP、目的IP、端口或协议的数据包)是网络管理中的常见任务。在Shell脚本中,可以通过结合网络抓包工具(如`tcpdump`)和文本处理工具(如`grep`、`awk`)来实现。核心思路是:捕获网络流量,过滤出目标报文,并触发自定义操作(如记录日志或发送警报)。以下是详细步骤和示例代码。 #### 1. **核心工具和方法** - **`tcpdump`工具**:用于捕获网络报文。它支持灵活的过滤表达式,例如监控特定端口(如80)或协议(如TCP)。 - 基本语法:`tcpdump [选项] [过滤表达式]` - 示例过滤:`tcpdump -i eth0 'tcp port 80'` 捕获eth0接口上所有TCP端口80的流量[^4]。 - **文本处理工具**:`grep`用于匹配报文内容,`awk`用于提取字段(如源IP地址)。这允许脚本分析`tcpdump`的输出并检测特定报文。 - **监控循环**:使用`while`循环定期检查报文,类似端口监控脚本的机制[^1]。 - **报警机制**:如果检测到目标报文,脚本可以记录日志或调用外部工具(如`mail`命令发送邮件),参考SSH登录报警的实现[^5]。 #### 2. **示例脚本** 以下是一个完整的Shell脚本示例,用于监控特定网络报文(例如,捕获所有目的端口为80的HTTP报文,并在检测到报文时记录日志)。脚本假设运行在Linux系统上,需要`tcpdump`和`grep`工具支持。 ```bash #!/bin/bash # 配置参数 INTERFACE="eth0" # 监控的网络接口,默认为eth0 FILTER="tcp port 80" # tcpdump过滤表达式,监控TCP端口80的报文 LOG_FILE="./packet_monitor.log" # 日志文件路径 ALERT_THRESHOLD=5 # 触发报警的报文数量阈值 SLEEP_TIME=10 # 检查间隔(秒) # 创建日志文件(如果不存在) touch "$LOG_FILE" # 主监控循环 while true; do # 使用tcpdump捕获报文,并统计匹配的报文数量 PACKET_COUNT=$(tcpdump -i "$INTERFACE" -c 10 "$FILTER" 2>&1 | grep -c "packet") # 检查报文数量是否超过阈值 if [ "$PACKET_COUNT" -ge "$ALERT_THRESHOLD" ]; then echo "$(date) 检测到 $PACKET_COUNT 个目标报文(过滤条件: $FILTER),可能存在异常流量!" >> "$LOG_FILE" # 可选:触发报警,如发送邮件或执行自定义脚本 # echo "警报:检测到高流量!" | mail -s "网络报文警报" admin@example.com else echo "$(date) 未检测到目标报文(过滤条件: $FILTER),当前数量: $PACKET_COUNT" >> "$LOG_FILE" fi # 等待下一次检查 sleep "$SLEEP_TIME" done ``` #### 3. **脚本关键点解释** - **捕获报文**:`tcpdump -i eth0 -c 10 "$FILTER"` 捕获指定接口的报文,`-c 10`表示只捕获10个报文后退出(避免脚本阻塞)。`2>&1`将错误输出重定向到标准输出,便于处理。 - **过滤和分析**:`grep -c "packet"`统计匹配的报文行数。您可以根据需求修改`FILTER`变量,例如: - 监控特定源IP:`FILTER="src host 192.168.1.100"` - 监控UDP报文:`FILTER="udp port 53"`(DNS报文)[^4]。 - **报警逻辑**:如果报文数量超过阈值,脚本记录日志。您可以在`if`块中添加自定义操作,如调用`mail`命令发送邮件,或集成引用[5]中的报警方法[^5]。 - **性能优化**:为避免资源占用,设置`SLEEP_TIME`(检查间隔)和`-c`参数(捕获报文数量)。在测试时,可以减小`SLEEP_TIME`或移除`-c`以实时监控。 - **运行脚本**: - 保存为`packet_monitor.sh`。 - 赋予执行权限:`chmod +x packet_monitor.sh`。 - 后台运行:`nohup ./packet_monitor.sh &`。 #### 4. **注意事项** - **权限要求**:`tcpdump`需要root权限。建议使用`sudo`运行脚本或在脚本开头添加`#!/bin/bash`后加`sudo`。 - **工具依赖**:确保系统安装`tcpdump`(安装命令:`sudo apt-get install tcpdump`)。如果报文内容复杂,可结合`awk`解析字段,例如提取源IP:`tcpdump ... | awk '{print $3}'`[^4]。 - **扩展性**:对于高流量环境,考虑使用更高效的工具如`tshark`(Wireshark命令行版),或集成到监控系统(如Zabbix)。 - **参考依据**:本方法基于网络抓包和文本处理原理,类似端口监控脚本的设计[^1][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值