程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

使用全局变量启动和停止snmpd子进程

发布于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黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

9 0
收藏该文
已收藏

评论内容:(最多支持255个字符)