如何在Mininet主机中稳定运行Python脚本?排查运行异常
解决Mininet后台运行Python脚本自动停止的问题
这问题我之前踩过坑!大概率是Mininet的进程管理机制和IO重定向的问题导致的,咱们一步步拆解解决:
问题根源分析
你用h1.cmd('python HTTPServer.py &')后台启动脚本时,Mininet的控制进程并没有给这些后台脚本提供稳定的终端环境:
- 脚本的标准输入/输出没有被正确重定向,一旦脚本尝试读取STDIN或者输出缓冲区被占满,就会阻塞挂起甚至退出
- 当Mininet的上下文发生变化(比如拓扑初始化完成后的资源清理),后台进程可能会收到
SIGHUP挂起信号而终止
而用xterm运行时,脚本拥有独立的终端会话,STDIN/STDOUT都绑定到终端,也不会被意外发送挂起信号,所以能正常运行。
针对性解决方案
1. 重定向IO+用nohup隔离信号
把启动命令改成下面这样,同时解决IO阻塞和信号终止的问题:
...Build a mininet topology... h1 = net.get('h1') # 用nohup忽略挂起信号,同时把输出/错误重定向到日志文件(方便排查问题) h1.cmd('nohup python /绝对路径/HTTPServer.py > /tmp/h1_server.log 2>&1 &') for i in ... ho = net.get('h%s' % i) ho.cmd('nohup python /绝对路径/host.py > /tmp/h%s_client.log 2>&1 &' % i)
nohup:让进程忽略SIGHUP信号,即使Mininet控制进程有变化也不会终止> /tmp/xxx.log 2>&1:把标准输出和错误输出都写入日志文件,避免IO阻塞,还能事后查看脚本运行日志
2. 确保脚本路径正确
Mininet主机的默认工作目录可能和你xterm进入后的目录不一样,如果脚本里用了相对路径读取配置/文件,会导致脚本报错退出。所以一定要用绝对路径指定脚本位置,或者先切换到脚本所在目录再启动:
h1.cmd('cd /你的脚本所在目录 && nohup python HTTPServer.py > /tmp/h1_server.log 2>&1 &')
3. 验证进程状态的小技巧
如果想确认脚本是否真的在运行,可以在Mininet交互界面里执行:
mininet> h1 cmd ps aux | grep HTTPServer
或者查看日志文件内容:
mininet> h1 cmd cat /tmp/h1_server.log
这样能快速排查脚本是真的退出了,还是只是没有输出。
内容的提问来源于stack exchange,提问作者lanhai
相关产品推荐
相关产品推荐

