centos 下检查整个网段主机连通性

没有经过多线程或者多进程处理脚本实行效率非常低下


import  subprocess

def ping(ip):
    
    result = subprocess.run(
       " ping -c 2 %s &>/dev/null" %ip ,shell=True )
    if result.returncode == 0:
        print("%s:UP" %ip)
    else:
        print("%s:down" %ip)
if __name__ == '__main__':
    ips = ["192.168.100.%s" %i for i in range (1,255)]
    for ip in ips:
        ping(ip)


通过多进程处理后脚本效率提高很多。

 os.frok() 是创建子进程语句,而 pid = 是赋值语句,所以在创建完子进程后,下一句为运行赋值语句。进程调用fork函数时,操作系统会新建一个子进程,它本质上与父进程完全相同。操作系统是将当前的进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回。子进程接收返回值为0,此时pid=0,而父进程接收子进程的pid作为返回值。调用fork函数后,两个进程并发执行同一个程序,首先执行的是调用了fork之后的下一行代码。

[root@localhost python_test]# cat frping.py
#!/usr/bin/env python3
import subprocess
import os
#定义函数,允许ping任何主机,ping函数需要给IP作为参数
def ping(host):
    result = subprocess.run(
        'ping -c2 %s &> /dev/null' %host , shell=True
    )
#定义ping命令的变量,返回值0:正常,返回值1:ping不通
    if result.returncode == 0:
        print('%s 主机可达' %host)
    else:
        print('%s 主机不可达' %host)
if __name__ == '__main__':
 #生成整个网段的IP列表[192.168.88.0]
    ips = ['192.168.88.%s' %i for i in range(255)]
    for ip in ips:
        pid = os.fork()  # 父进程负责生成子进程
        if pid ==0:
            ping(ip)      # 子进程负责调用ping函数
            exit()

多线程机动

 多线程特点

 什么是进程

 什么是线程:

 python相关线程模块

 下面是线程案例:

import subprocess
import threading
def ping (ip):
    result = subprocess.run('ping -c2 %s &>/dev/null' %ip ,shell=True)
    if result.returncode == 0:
        print('%s UP'%ip)
    else:
        print('%s Down' %ip)
if __name__=='__main__':
    ips = ('192.168.100.%i' %i for i in range(1,255))
    for ip in ips:
        thread = threading.Thread(target=ping,args=(ip,)) #创建一个线程
        thread.start()##启动线程,相当target(*args)

OP面对象写法:


import subprocess
import threading
class Ping:
    def __call__(self, ip):
        result = subprocess.run('ping -c2 192.168.100.%s &>/dev/null' %ip,shell=True)
        if result.returncode == 0:
            print('%s Up' %ip)
        else:
            print('%s Down' %ip)
if __name__ == '__main__':
    ips = ('192.168.100.%s' %i for i in range(1,255))
    for ip in ips:
#target是Ping的实例,该对象具有调用功能
        Thread = threading.Thread(target=Ping(),args=(ip,))
        Thread.start() #调用target(*args)

op面向对象另外写法:

import subprocess
import threading

class Ping:
    def __init__(self,ip):
        self.ip = ip
    def __call__(self):
        result = subprocess.run('ping -c2 192.168.100.%s &>/dev/null' %self.ip,shell=True)
        if result.returncode == 0:
            print('%s UP' %self.ip)
        else:
            print('%s Down' %self.ip)
if __name__ == '__main__':
    ips = ('192.168.100.%s' %i for i in range(1,255))
    for ip in ips:
        Thread = threading.Thread(target=Ping(ip),)
        Thread.start()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值