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思考一个问题:

目录
相关文章
|
6月前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
83 3
|
2月前
|
域名解析 网络协议 测试技术
IP、掩码、网关、DNS1、DNS2到底是什么东西,ping telnet测试
理解IP地址、子网掩码、默认网关和DNS服务器的概念是有效管理和配置网络的基础。通过使用ping和telnet命令,可以测试网络连通性和服务状态,快速诊断和解决网络问题。这些工具和概念是网络管理员和IT专业人员日常工作中不可或缺的部分。希望本文提供的详细解释和示例能够帮助您更好地理解和应用这些网络配置和测试工具。
184 2
|
3月前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
44 3
|
4月前
|
存储 Linux Docker
CentOS 7.6安装Docker实战案例及存储引擎和服务进程简介
关于如何在CentOS 7.6上安装Docker、介绍Docker存储引擎以及服务进程关系的实战案例。
205 3
CentOS 7.6安装Docker实战案例及存储引擎和服务进程简介
|
4月前
|
网络协议 C语言
C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
|
5月前
|
算法 Java
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
该博客文章综合介绍了Java并发编程的基础知识,包括线程与进程的区别、并发与并行的概念、线程的生命周期状态、`sleep`与`wait`方法的差异、`Lock`接口及其实现类与`synchronized`关键字的对比,以及生产者和消费者问题的解决方案和使用`Condition`对象替代`synchronized`关键字的方法。
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
|
4月前
|
C语言
C语言 网络编程(八)并发的UDP服务端 以进程完成功能
这段代码展示了如何使用多进程处理 UDP 客户端和服务端通信。客户端通过发送登录请求与服务端建立连接,并与服务端新建的子进程进行数据交换。服务端则负责接收请求,验证登录信息,并创建子进程处理客户端的具体请求。子进程会创建一个新的套接字与客户端通信,实现数据收发功能。此方案有效利用了多进程的优势,提高了系统的并发处理能力。
|
4月前
|
数据采集 消息中间件 并行计算
进程、线程与协程:并发执行的三种重要概念与应用
进程、线程与协程:并发执行的三种重要概念与应用
94 0
|
4月前
|
调度 Python
python3多进程实战(python3经典编程案例)
该文章提供了Python3中使用多进程的实战案例,展示了如何通过Python的标准库`multiprocessing`来创建和管理进程,以实现并发任务的执行。
135 0
|
5月前
|
存储 Linux Shell
在Linux中,如何使用脚本,实现判断 192.168.1.0/24 网络里,当前在线的 IP 有哪些?能ping 通则 认为在线。
在Linux中,如何使用脚本,实现判断 192.168.1.0/24 网络里,当前在线的 IP 有哪些?能ping 通则 认为在线。
下一篇
开通oss服务