【发布时间】: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.kill。kill -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