【发布时间】:2019-02-15 11:11:55
【问题描述】:
我正在 ping 局域网中的多个 ip 以检查它是否处于活动状态。代码将根据计划每分钟运行一次。对于 ping 多个 ip,我使用了多处理。它在多处理的帮助下做得很好。同时,我想在 ping 之后将 ping 结果写入 json 文件。但是当写入 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"}}
【问题讨论】:
-
我知道这听起来有点奇怪,但是您可以将数据写入 mongodb 数据库而不是将其写入 json,然后将该数据库导出到 json 文件中?
-
我认为如果您使用 sqlite 而不是 JSON 文件,您的监控解决方案的扩展性会更好。只需创建一个简单的表(字段:时间戳、主机、状态)并将数据插入到该表中。看这里怎么做:sqlitetutorial.net/sqlite-python
标签: python json python-3.x multiprocessing subprocess