python中,如何实时获取PING命令的结果

ping命令在ping通或者不通的时候,大概是下面两个情况

在这里插入图片描述
技术栈使用了 Flask框架和redis

数据处理

# 存储ping数据的redis 1号库
redis_sh = StrictRedis(host='127.0.0.1', port=6379, decode_responses=True, db=1)

def flush_sh_redis():
	# 清空redis 1号库
    redis_sh.flushdb()

def sh(command, ip):
    p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    not_ping = "PING %s (%s) 56(84) bytes of data." % (ip, ip)
    flag = 0  # 自定义的返回值--避免ping失败无数据返回
    num = 1  # 每一行ping结果标识 (key)
    redis_sh.set("sh1", not_ping + "\n")
    row = 1
    for line in iter(p.stdout.readline, b''):
        line = line.rstrip().decode('utf8')

        if flag == 0:  # ping操作有结果 第一次进入
            redis_sh.set("sh1", line + "\n") # 将自定义的返回值覆盖
            flag = 1 
            num += 1  # key 值加一
            row = 2
        else:
            if row == 2:
                redis_sh.append("sh1", line + "\n") # 这里使用append的原因是,实际在使用ping命令时,【PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.】【64 bytes from 1.1.1.1: icmp_seq=2 ttl=54 time=185 ms】这两行是同时出现的,为了效果更真实,在sh1里面保存了两条返回值

                row = 1
            else:
                redis_sh.set("sh" + str(num), line + "\n")
                print(num, line)
                num += 1

    redis_sh.set("sh" + str(num), "over") # over表示当前ping操作结束


def get_sh(num):
    result = redis_sh.get("sh" + num)
    return result

数据获取

@diagnosis.route("/ping", methods=["POST"])
def ping():
    # 执行ping命令
    flush_sh_redis()  # 每次请求ping时,清空指定redis某个库
    ip = request.form.get("ip")
    if not ip:
        return jsonify(status=4004, msg="ip参数不能为空")
	
	# 中文校验        
    a = re.match(r"^[\x00-\xff]+$", ip)
    if not a:
        sysconfig_log.info("ping测试失败")
        return jsonify(status=4004, msg='ping命令不能包含中文')
    command = "ping -c 5 -w 10 %s" % ip
    try:
       # 起线程执行ping命令
        task = threading.Thread(target=sh, args=(command, ip))
        task.start()
    except Exception as e:
        print(e)
        return jsonify(status=4004, msg='ping命令执行失败')
    return jsonify(status=0, msg="开始进行ping测试")


@diagnosis.route("/get_ping_result", methods=["GET"])
def get_ping_result():
   # 获取ping结果
   # num参数,表示前端第几次获取数据,num从1开始,前端在调用时,如果当前num值没有获取到数据,那么num值不变,继续调用该接口,获取当前num值得数据,直到拿到数据为止
    num = request.args.get("num")
    num = str(num)

    result = get_sh(num)
    if result == "over":
        return jsonify(status=2, msg="over")
    if not result:
        return jsonify(status=1, msg="暂无数据")  # 请求的数据暂时没有生成,继续使用当前num值发出请求

    result = result.split("\n")
    result.pop(-1)
    data = {
        "data_list": result,
        "flag": True
    }
    return jsonify(data=data, status=0, msg="ping测试成功")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值