为了账号安全,请及时绑定邮箱和手机立即绑定

Ping多个ips并写入JSON文件python

Ping多个ips并写入JSON文件python

海绵宝宝撒 2021-11-09 19:35:45
我正在 ping LAN 中的多个 ip 以检查它是否处于活动状态。代码将根据计划每分钟运行一次。为了 ping 多个 ip,我使用了多处理。它在多处理的帮助下做得很好。同时,我想在ping后将ping结果写入json文件。但是写入JSON文件时,它只写入最后一个ip的输出。我想要所有三个。有没有办法做到这一点这是示例代码:import jsonfrom multiprocessing import Poolimport subprocessfrom datetime import datetimetimestamp = datetime.now().strftime("%B %d %Y, %H:%M:%S")hosts =  ["192.168.1.47","192.168.1.42"]count = 1wait_sec = 1n = len(hosts)def main(hosts):    p = Pool(processes= n)    result = p.map(beat, hosts)def beat(hosts):    #Name for the log file    name = 'icmp.json'    ip4write(hosts, name)def ip4write(hosts, name):    global ip4a    ip4a = hosts    ipve4(hosts, name)    write(hosts, name)def ipve4(hosts, name):    global u    status, result = subprocess.getstatusoutput("ping -c1 -w2 " + str(ip4a))    if status == 0:        print(str(ip4a) + " UP")        u = " UP"def write(hosts, name):    text_file = open(name, "a+")    with open(name) as json_file:      try:          data = json.load(json_file)      except:          data = {}      with open(name, 'w') as outfile:        data[timestamp] = {          'monitor.ip':str(hosts),          'monitor.status': u        }        print(data)        json.dump(data, outfile)        print('Data written')    text_file.close()main(hosts)JSON 文件中的输出:{"February 15 2019, 16:38:12": {"monitor.status": " UP", "monitor.ip": "192.168.1.42"}}我需要的输出:{"February 15 2019, 16:38:12": {"monitor.ip": "192.168.1.47", "monitor.status": " UP"}, "February 15 2019, 16:38:12": {"monitor.ip": "192.168.1.42", "monitor.status": " UP"}}
查看完整描述

2 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

要在不覆盖现有内容的情况下继续向现有文件添加内容,您应该以“追加”模式打开。在您的代码中,您以“写入”模式打开。这将打开文件进行写入,但会覆盖现有内容。

具体来说,您的代码中的这一行:

with open(name, 'w') as outfile:

您应该将打开模式从 write ( 'w')更改为 append ( 'a')。

with open(name, 'a') as outfile:

如果这能解决您的问题,请告诉我。


查看完整回答
反对 回复 2021-11-09
?
万千封印

TA贡献1891条经验 获得超3个赞

下面是代码的精简版:


import os

from multiprocessing import Pool

import json

import datetime

import time


hosts = ["192.168.1.47", "8.8.8.8"]

MAX_NUMBER_OF_STATUS_CHECKS = 2

FILE_NAME = 'hosts_stats.json'



#

# counter and sleep were added in order to simulate scheduler activity  

#


def ping(host):

    status = os.system('ping  -o -c 3 {}'.format(host))

    return datetime.datetime.now().strftime("%B %d %Y, %H:%M:%S"), {"monitor.ip": host,

                                                                "monitor.status": 'UP' if status == 0 else 'DOWN'}



if __name__ == "__main__":

    p = Pool(processes=len(hosts))

    counter = 0

    if not os.path.exists(FILE_NAME):

        with open(FILE_NAME, 'w') as f:

            f.write('{}')

    while counter < MAX_NUMBER_OF_STATUS_CHECKS:

        result = p.map(ping, hosts)

        with open(FILE_NAME, 'rb+') as f:

            f.seek(-1, os.SEEK_END)

            f.truncate()

            for entry in result:

                _entry = '"{}":{},\n'.format(entry[0], json.dumps(entry[1]))

                f.writelines(_entry)

             f.write('}')

        counter += 1

        time.sleep(2)


查看完整回答
反对 回复 2021-11-09
  • 2 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信