我在Python 2.7下的程序(在linux上)具有以下功能:
signal.signal(signal.SIGINT,self.stop) # CTRL-C stop (-INT TERM)
signal.signal(signal.SIGUSR1,self.pause) # pause
signal.signal(signal.SIGUSR2,self.resume) # resume
signal.signal(signal.SIGTERM,self.stop) # stop
使用kill-pid,所有这些都可以正常工作。但是,如果在执行期间按CTRL-C,stop函数将被调用两次。你知道吗
我甚至尝试捕捉KeyboardInterrupt异常,但它从未被调用。你知道吗
如果我的stop函数调用了两次,就会引发一个异常,我现在已经注释掉了这个异常,但是我更希望在没有解决方法的情况下运行这个函数。你知道吗
有什么想法吗?你知道吗
INT和TERM的信号处理程序
def stop(self,signum=None,stack=None):
if self._state == WASP_RUNNING or self._state == WASP_PAUSED:
logging.info("**** Stopping Wasp ****")
self._halt.set()
else:
raise WaspRuntimeException, "Wasp state %d not valid for stop" % self._state
上面的调用是WaspRuntimeException调用的两倍。我还添加了打印声明来证实这一点。你知道吗
整个节目很冗长。下面是启动函数,希望它是重要的部分。init只将所有内部变量设置为无。函数_create(),读取一个配置文件,创建事件_halt,在监视模式下创建一个虚拟无线nic,创建一个子进程(目前)扫描器,扫描器每隔100ms左右设置一个无线nic通道。函数\u destroy()销毁虚拟nic,向扫描器发送毒丸并等待其加入。你知道吗
def start(self):
signal.signal(signal.SIGINT,self.stop) # CTRL-C stop
signal.signal(signal.SIGUSR1,self.pause) # pause
signal.signal(signal.SIGUSR2,self.resume) # resume
signal.signal(signal.SIGTERM,self.stop) # stop
logging.info("**** Starting Wasp ****")
self._create()
self._state = WASP_RUNNING
while not self._halt.is_set():
if self._state == WASP_RUNNING:
if self._err.has_key('scanner'):
logging.error("Scanner failed. (%s) %s",self._err['scanner'][0],\
self._err['scanner'][1])
self._state = WASP_INVALID
self._halt.set()
continue
time.sleep(1)
self._destroy()
该程序称为:
if __name__ == 'wasp':
w = None
try:
logging.info("Wasp %s",__version__)
w = Wasp()
w.start()
except WaspConfException, e: # w failed to start, no need to stop
logging.error("Configuration Error: %s",e)
except WaspParamException, e:
logging.error("Parameter Error: %s",e)
if w and (w.state() == WASP_RUNNING or w.state() == WASP_PAUSED): w.stop()
except WaspRuntimeException, e:
logging.error("Runtime Error: %s",e)
if w and (w.state() == WASP_RUNNING or w.state() == WASP_PAUSED): w.stop()
except WaspException, e:
logging.error("General Error: %s",e)
if w and (w.state() == WASP_RUNNING or w.state() == WASP_PAUSED): w.stop()
except Exception, e:
logging.exception("Unknown Error: %s",e)
if w and (w.state() == WASP_RUNNING or w.state() == WASP_PAUSED): w.stop()
我最初认为可能是异常被调用,从而导致stop再次被调用。但是,没有记录任何内容。我添加了如上所示的状态检查以确保。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐