首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PYSNMP停止并重新启动陷阱接收器

PYSNMP停止并重新启动陷阱接收器
EN

Stack Overflow用户
提问于 2014-02-21 04:34:27
回答 1查看 1.7K关注 0票数 0

我正在尝试创建一个pysnmp守护进程。我希望能够启动、停止和重新启动正在运行守护进程的线程。我在清理套接字、通知接收器和传输调度器时遇到问题。

我使用的是pysnmp v1/2c陷阱接收器

代码语言:javascript
运行
复制
class trapReceiverThread(threading.Thread):
def __init__(self):
    try:
        trapworking = snmpEngine.transportDispatcher.jobsArePending()
    except:
        trapworking = -1

    if trapworking == 0:
        snmpEngine.transportDispatcher.jobStarted(1)

    elif trapworking == -1:
        print "starting"
        # UDP over IPv4, first listening interface/port
        config.addV1System(snmpEngine, 'my-area', 'public')

        # SecurityName <-> CommunityName mapping
        print "d0"
        config.addSocketTransport(
                                  snmpEngine,
                                  udp.domainName + (1,),
                                  udp.UdpTransport().openServerMode(( 'localhost', 162 ))
                                  )
        ntfrcv.NotificationReceiver(snmpEngine, cbFun)
        snmpEngine.transportDispatcher.jobStarted(1)
    else:
        print "Trap receiver already started."

def run(self):
    try:
        snmpEngine.transportDispatcher.runDispatcher()
    except:
        print "fail"
        snmpEngine.transportDispatcher.closeDispatcher()
        raise

def cbFun(snmpEngine,
          stateReference,
          contextEngineId, contextName,
          varBinds,
          cbCtx):
    transportDomain, transportAddress = snmpEngine.msgAndPduDsp.getTransportInfo(stateReference)
    print('Notification from %s, ContextEngineId "%s", ContextName "%s"' % (
        transportAddress, contextEngineId.prettyPrint(),
        contextName.prettyPrint()
        )
    )
    for obj in varBinds:
         print obj

trapStatus = threading.Thread(target = trapReceiverThread().run)
trapStatus.deamon = True

def start():
    global trapStatus
    if trapStatus.isAlive() == False:
        try:
            trapStatus.start();
        except:
            trapStatus = threading.Thread(target = trapReceiverThread().run)
            trapStatus.start();           

def stop():
    if snmpEngine.transportDispatcher.jobsArePending():
        print "stopping"
        """
        CODE to stop SocketTransport, transportDispatcher, and NotificationReceiver
        """
        snmpEngine.transportDispatcher.jobFinished(1)
        trapStatus.join()

def restart():
    stop()
    start()
EN

回答 1

Stack Overflow用户

发布于 2014-02-26 04:59:30

由于陷阱是通过本地变量transportDispater定义的,因此可以通过完成作业#1并释放端口来停止该进程。

代码语言:javascript
运行
复制
transportDispatcher.jobFinished(1)                
transportDispatcher.unregisterRecvCbFun(recvId=None)
transportDispatcher.unregisterTransport(udp.domainName)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21918934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档