【问题标题】:Run multiple subprocesses in parallel - python 2.7并行运行多个子进程 - python 2.7
【发布时间】:2018-03-06 14:17:50
【问题描述】:

下面显示的脚本是我尝试使用在 Linux (Fedora) 操作系统上运行的 python 2.7 ping 多个网络命名空间。

当前状态和问题

当我运行这个文件时;来自 elem1(命名空间)的 ping 存储在名为 results.txt 的文件中。 但是,我似乎无法让循环回来并 ping elem2, elem3, ... elemN

尝试修复

我尝试使用“kill -9 p.pid”(如图所示)终止该进程,希望这会终止该进程,然后可以在循环的下一次迭代中创建一个新进程。然而,这种情况并非如此! 我检查了文档 (https://docs.python.org/2/library/subprocess.html) 并尝试了几种不同的 kill()、terminate()、删除 shell=True 等排列...但无济于事。

import time
import os
import signal
import subprocess    

IP_ADDR="192.168.1.1"    

def main():
arry =["elem1", "elem2", "elem3", "elem4", "elem5", "elem6", "elem7"]  array of network namespaces's to ping

        with open('results.txt', 'a+') as outfile:
            for elem in arry:
                command = "ip netns exec {0} ping {1}".format(elem, IP_ADDR)
                outfile.write("\n\nPinging {}\n".format(elem))
                p = subprocess.Popen(command, shell=True, stdout=outfile)
                command_kill = "kill -9 {}".format(p.pid)
                time.sleep(2) #wait 5 seconds
                p.kill()
        outfile.close()

if __name__ == '__main__':
    main()

我的问题

(1) 有人能解释一下代码在这里做什么吗?

(2) 您能否提出实现上述目标的方法?

谢谢

【问题讨论】:

  • 进程已经在后台运行。唯一能阻止所有 ping 立即运行的方法是调用 time.sleep,然后调用 p.killkill -9 很可能会阻止进程在操作系统强制退出之前正确写入其输出。
  • 感谢@chepner,正如我建议的那样,我删除了命令 time.sleep(2) 和 p.kill() 行。输出文件现在显示 Pinging elem1 - elem7,然后依次输出 ping 结果。我希望它会执行如下操作: Pinging elem1 ... [在此处插入 elem1 ping 结果] Pinging elem2 ... [在此处插入 elem2 ping 结果],... Pinging elem7 ... [在此处插入 elem7ping 结果]跨度>

标签: python linux networking subprocess ping


【解决方案1】:

除了@chepner 提到的修改,您可以尝试使用subprocess.call() 而不是subprocess.Popen()。后一种方法不是阻塞的,这会导致所有命令同时执行。但是,call() 处于阻塞状态,因此您的脚本将等到 ping 完成后再进入循环的下一次迭代。这将导致您的命令输出按顺序而不是交错。

如果您需要并行执行命令,我建议将输出写入不同的文件,并在所有命令完成后合并它们。

编辑:我在这方面没有特别的经验,但我猜终止问题仅与ping 命令有关。在此处查看手册页:https://linux.die.net/man/8/ping。在我们的例子中,我们需要 ping 目标 X 次。这是通过使用参数-c X 指定的,其中X 定义要发送的数据包的数量。该参数还可以与参数-w / -W 结合使用,指定ping 命令的超时限制。看一些例子:https://www.thegeekstuff.com/2009/11/ping-tutorial-13-effective-ping-command-examples/

【讨论】:

  • 谢谢@sikr。我修改了代码以调用 subprocess.call 而不是 subprocess.Popen。我对此的唯一问题是它会无限期地 ping 第一个命名空间。我基本上想 ping elem1 网络命名空间 X 次,然后 elem2 X 次,然后 elem3 X 次......你如何建议我在 X 次迭代后停止 ping。注意:我使用以下命令执行 ping:ip netns elemX ping 192.268.x.y
  • Thnaks @sikr_ 这行得通。为了向未来的读者澄清,解决方案如下所示: command = "ip netns exec {0} ping -c 3 -w 5 {1}".format(elem1, IP_ADDR) p = subprocess.call(command, stdout=outfile,壳=真)
猜你喜欢
  • 2022-01-25
  • 2020-06-16
  • 2013-05-03
  • 1970-01-01
  • 2023-01-09
  • 1970-01-01
  • 2013-10-10
  • 2011-12-16
  • 2023-03-07
相关资源
最近更新 更多