Пингуйте несколько ips и пишите в файл JSON python - PullRequest
0 голосов
/ 15 февраля 2019

Я проверяю несколько ips в локальной сети, чтобы проверить, является ли он живым или нет.код будет запускаться каждую минуту в соответствии с расписанием. Для проверки нескольких ips я использовал многопроцессорность.Это делается великолепно с помощью многопроцессорной обработки.Одновременно я хочу записать результаты ping в файл json после ping.Но при записи в файл JSON он записывает только выходные данные последнего ip. Я хочу все три.Есть ли способ сделать это

Вот пример кода:

import json
from multiprocessing import Pool
import subprocess
from datetime import datetime
timestamp = datetime.now().strftime("%B %d %Y, %H:%M:%S")
hosts =  ["192.168.1.47","192.168.1.42"]
count = 1
wait_sec = 1
n = 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 ]

0 голосов
/ 15 февраля 2019

Ниже приведена компактная версия кода:

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)
0 голосов
/ 15 февраля 2019

Чтобы продолжить добавление содержимого в существующий файл без перезаписи существующего содержимого, следует открыть его в режиме «добавления».В вашем коде вы открываете в режиме «записи».Который откроет файл для записи, но перезапишет существующее содержимое.

В частности, эта строка в вашем коде:

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

Вам следует изменить режим открытия с записи ('w') наappend ('a').

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

Дайте мне знать, если это решит вашу проблему.

...