shell实战案例-批量ping ip(多进程限制并发)

简介: shell实战案例-批量ping ip(多进程限制并发)

批量ping IP

要点:

1. 定义trap 捕捉INT信号,以便退出。

2. 生成序列的方式可以使用{} , 也可以使用seq 2 254

seq -w 还可以等位补齐,很好用

922a5628ac2d4f12bfdcaa78ede23612.png

3.ping

-c 参数代表次数。不会像windows一样ping四次后停止,次数由用户指定.

-W 代表timeout,1表示的是超过三秒钟就定义为ping不通

4.ping -c1 -W1 $ip &>/dev/null  将ping的STDOUT个STDERR 输出到黑洞文件.

5. echo "$ip" | tee -a ip.txt 代表 输出控制台的同时也追加写到ip.txt

#!/bin/bash
#批量 ping ip 是否可以ping 通  ping 同网段的ip
# 2022年1月2日15:51:02
trap "echo trapped!;exit 1" SIGINT SIGTERM SIGQUIT SIGHUP
> ip.txt
for i in {2..254};do
        ip=8.142.104.$i
        ping -c1 -W1 $ip &>/dev/null
        if [ $? -eq 0 ];then
                echo "$ip" | tee -a ip.txt
                #sleep 1s
        fi
done

ping操作比较省时间,如果是个复杂的事情,在一个bash进程中处理太慢了

如何使用多进程处理呢?

脚本稍加改造:

多进程很好实现,将for循环体用{} &放入后台执行即可。

#!/bin/bash
#批量 ping ip 是否可以ping 通  ping 同网段的ip
# 2022年1月2日15:51:02
trap "echo trapped!;exit 1" SIGINT SIGTERM SIGQUIT SIGHUP
> ip.txt
for i in {2..254};do
  {
  ip=8.142.104.$i
  ping -c1 -w1 $ip &>/dev/null
  if [ $? -eq 0 ];then
    echo "$ip" | tee -a ip.txt
  fi    
  } &
done  
echo "finish...."

1cbd0d8cf0f54048ae4f2d160c0c4167.png这个结果好像不太对,finish...怎么先打印出来了呢?

主进程一下子就执行完了,都在等待子进程的执行,如何让主进程等待其他子进程做完之后再执行呢?

使用wait命令

ade20e52155c40b19c4000558644ccfa.png

如何限制并发呢?

多进程是实现了,但是没有限制并发,ping一个网段还好一点,如果要ping 100个网段呢?200个网段呢? 如果不限制并发,机器的性能总有被榨干的时候。

借助管道实现并发控制。

实现思路: 使用一个fd 打开管道,往管道中送一些空行(多少个空行就多少个进程)。

在bash中通过此方法模拟co-process(协程) 实现不同进程之间的异步通信。

代码实现

#!/bin/bash
#批量 ping ip 是否可以ping 通  ping 同网段的ip
# 2022年1月2日15:51:02
count=$1
#创建管道文件
filename=/tmp/$$.fifo # 当前bash的pid
mkfifo $filename
# 以可读可写方式 用fd8 指向fifo
exec 8<> $filename
#rm -rf $filename # exec 已经指向了这个fifo, 即使删除,这个管道并不会被删除,除非关闭fd8,管道才会消失
#向管道中注入空行,注入多少个取决于你希望的并发量
echo $count
for line in `seq $count`;do
        echo >&8
done
trap "echo trapped!;exit 1" SIGINT SIGTERM SIGQUIT SIGHUP
> ip.txt
for i in {2..254};do
        read -u 8 # 在fd8 中读取内容 read from file descriptor FD instead of the standard inpu
        {
        ip=8.142.104.$i
        ping -c1 -w1 $ip &>/dev/null
        if [ $? -eq 0 ];then
                echo "$ip" | tee -a ip.txt
                sleep 1s
        fi
        echo >&8
        } &
done
wait
exec 8>&- # 释放文件描述符
echo "finish...."

不一定是等三个执行完再执行另外三个,只要管道中能读取到空行就可以执行。可以将参数传2 看的更清楚

5a5d15429ebf4dab9c7927114969029c.png思考一个问题:

目录
相关文章
|
11月前
|
缓存 NoSQL Unix
【实战指南】守护进程服务实现
本文介绍了在Linux系统中实现守护进程异常重启的几种方案。通过理解僵死进程和信号处理机制,提出了基于SIGCHLD信号监听、轮询proc文件系统及waitpid接口的三种方法,并给出了C++实现代码。最终选择轮询方式以提升稳定性,确保服务进程在崩溃后能自动重启,保障系统可靠性。
512 89
|
Ubuntu Linux
Ubuntu下载工具:ip addr、ifconfig、ping、make的使用
的选项和参数,这里只是简单地介绍了它们的基本用法。如果你想要深入学习这些工具,我建议你查阅它们的man页面,或者找一本好的Linux教程进行学习。
622 22
|
运维 Shell 数据库
Python执行Shell命令并获取结果:深入解析与实战
通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。
539 20
|
域名解析 网络协议 测试技术
IP、掩码、网关、DNS1、DNS2到底是什么东西,ping telnet测试
理解IP地址、子网掩码、默认网关和DNS服务器的概念是有效管理和配置网络的基础。通过使用ping和telnet命令,可以测试网络连通性和服务状态,快速诊断和解决网络问题。这些工具和概念是网络管理员和IT专业人员日常工作中不可或缺的部分。希望本文提供的详细解释和示例能够帮助您更好地理解和应用这些网络配置和测试工具。
9627 2
|
存储 Linux Docker
CentOS 7.6安装Docker实战案例及存储引擎和服务进程简介
关于如何在CentOS 7.6上安装Docker、介绍Docker存储引擎以及服务进程关系的实战案例。
928 3
CentOS 7.6安装Docker实战案例及存储引擎和服务进程简介
|
人工智能 PyTorch 算法框架/工具
Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
【8月更文挑战第6天】Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
225 3
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
4135 2
|
网络协议 关系型数据库 MySQL
Shell 脚本案例
Shell 脚本案例
169 8
|
消息中间件 Kafka 数据安全/隐私保护
Python IPC实战指南:构建高效稳定的进程间通信桥梁
【9月更文挑战第11天】在软件开发中,随着应用复杂度的提升,进程间通信(IPC)成为构建高效系统的关键。本文通过一个分布式日志处理系统的案例,介绍如何使用Python和套接字实现可靠的IPC。案例涉及定义通信协议、实现日志发送与接收,并提供示例代码。通过本教程,你将学会构建高效的IPC桥梁,并了解如何根据需求选择合适的IPC机制,确保系统的稳定性和安全性。
304 5