【问题标题】:Python scrips failing and dropping 0 CPU usagePython 脚本失败并丢弃 0 CPU 使用率
【发布时间】:2015-12-26 15:59:58
【问题描述】:

脚本的总体目标是对 /8 网络进行有效的 ping。为此,我同时运行 32 个脚本来扫描每个 /13。

脚本的基础是

import ipaddress
import time
import fileinput
import pingpack
set = 0
mainset =0
while mainset < 8:
    while set < 256:
        net_addr = ("10.{}.{}.0/24".format(mainset,set))
        ip_net = ipaddress.ip_network(net_addr)
        all_hosts = list(ip_net.hosts())
        f_out_file=('{}_Ping.txt'.format(mainset))
    for i in range(len(all_hosts)):
        output = pingpack.ping("{}".format(all_hosts[i]))
        if output != None:
            with open(f_out_file,'a',newline="\n") as file:
                file.write("{}, Y\r\n".format(all_hosts[i]))

    print ("{}".format("Subnet Complete"))
    set = set + 1
set=0

它自己运行和运行的脚本在它自己运行时给我一个很好的输出。我遇到的问题是,当我为每个子网运行其中的 32 个时,它们在 python 进程锁定并停止写入之前运行了大约 8 个设置循环。

我用来启动32的脚本如下

from subprocess import Popen, PIPE
import time
i = 0
count=0
while i < 32:
    process = Popen(['ping{}.py'.format(i),"{}".format(count)], stdout=PIPE, stderr=PIPE, shell=True)
    print(count)
    print(i)
    i = i + 1
    count=count+8
    time.sleep(1)

在这种情况下;是的;我确实有 32 个重复的脚本,每个脚本有 2 行针对不同的 /13 子项进行了更改。它可能和一些一样有效;但它让他们开始并运行。

我将如何找到这些脚本停止的原因?

旁注:是的,我知道我可以使用 NMAP 或 Angry IP Scanner 之类的工具来做到这一点;但他们都需要 90 多个小时来扫描整个 /8;我正在尝试将其缩短为可以在更合理的时间范围内运行的内容。

【问题讨论】:

  • 我怀疑你会击败 nmap 的性能 - 他们有一个多线程/并行模式来帮助提高吞吐量:nmap.org/book/man-performance.html
  • 你用的是什么操作系统?
  • @AlastairMcCormack 我遇到namp的问题是我在东主机上进行了双重扫描(发现然后端口扫描);最重要的是,如果该过程中途中断,我将丢失所有数据;在 python 中,我可以不断地写入文件并且不会丢失数据。
  • @PadraicCunningham 我正在运行 Windows 7,遗憾的是无法访问网络上的 linux 发行版;我认为一个简单的 bash 脚本可以比 python 更快、更干净,但这不是一个选择。
  • @AlastairMcCormack 扩展命令并使用并行性; nmap -sn --min-parallelism 100 -T5 -oN c:/dump/nmapscan.txt 10.0.0.0/8 看起来是 48 小时的 ping 跨度。从我所看到的情况来看,即使某些主机发现也无法更快地推送。这仍然比 python 脚本(运行在 32 个进程 vs namp)更快,并且仍然比愤怒的 ip 扫描器更快。如果我能让 python 脚本并行运行 64 或 128,那么 python 可能会更快。

标签: python subprocess popen


【解决方案1】:

您的第一个问题是set 在您转到下一个主组时永远不会设置回零。您的第二个问题是 mainset 永远不会增加。而不是一对晦涩的while循环,为什么不呢:

for mainset in xrange(8):
    for set in xrange(256):

另外,in range(len(all_hosts)) 是一种代码异味(事实证明,除了写all_hosts[i] 之外,您从不使用i)。为什么不:

        for host in all_hosts:

【讨论】:

  • 感谢您的帮助;我能够为范围(0,8,1)中的 mainset 和范围(0,255,1)中的集合获得范围:因为 xrange 在 3.x python 中不再存在
  • 想添加这个;运行了大约 1 小时,脚本没有停止。看起来它只是在循环。再次感谢您。
  • 如果您使用的是 Python 3,请使用 range(8)range(x) 等价于 range(0,x,1)
猜你喜欢
  • 1970-01-01
  • 2020-04-17
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多