发布于2020-12-27 09:10 阅读(587) 评论(0) 点赞(9) 收藏(4)
我将从子流程开始snmpd,将对此的引用存储为全局变量,然后在以后取消该流程。
我开始这样的过程:
snmp_proc = subprocess.Popen(['snmpd', '-p', pid_file,'-Lf', log_file],
stdout=open(os.devnull,'w'),stderr=subprocess.STDOUT)
这可以正确启动,但似乎还会造成某种僵尸进程?ps ax输出给出:
1716 ? Z 0:00 [snmpd] <defunct>
1718 ? S 0:00 snmpd -p /var/run/snmpd.pid -Lf /var/log/snmpd
现在,当我稍后尝试杀死该进程时,只会杀死已失效的僵尸进程,而剩下的其他进程将被保留。知道我在做什么错吗?这是停止snmpd的代码:
def stop_snmp():
global snmp_proc
if not snmp_proc:
return
snmp_proc.terminate()
snmp_proc.wait()
snmp_proc = None
<defunct>
表示子进程已死,但您尚未读取其退出状态(使用snmp_proc.wait()
)。
我的猜测:snmpd
启动一个守护进程(双叉等)并立即返回,即,避免僵尸,请使用subprocess.check_call()
代替subprocess.Popen()
这里。
要停止启动的守护程序服务,应该有一个特殊命令。如果没有,则从中读取pidpid_file
并使用它向os.kill()
守护程序发送信号()以杀死它。
我只是通过传递-f以禁用分叉来解决此问题
是的,禁用守护行为是另一种选择。在这种情况下,snmpd
将以相同的进程(由开头Popen()
)运行服务,因此除非出现致命错误(例如,启动失败),否则它不应成为僵尸。
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/719255/15484cf45e14b381cdb5/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!