2013-02-26 87 views
14

我有这样的代码,它会监听USR1信号如何从python程序发送信号?

import signal 
import os 
import time 

def receive_signal(signum, stack): 
    print 'Received:', signum 

signal.signal(signal.SIGUSR1, receive_signal) 
signal.signal(signal.SIGUSR2, receive_signal) 

print 'My PID is:', os.getpid() 

while True: 
    print 'Waiting...' 
    time.sleep(3) 

这工作时,我发出信号,kill -USR1 pid

但我怎么可以从发送上面的Python脚本中相同的信号,使10秒后它自动发送USR1也收到它,我不必打开两个终端来检查它?

回答

5

如果你愿意搭上SIGALRM,而不是SIGUSR1,请尝试:

signal.alarm(10) 

否则,你需要启动另一个线程:

import time, os, signal, threading 
pid = os.getpid() 
thread = threading.Thread(
    target=lambda: (
    time.sleep(10), 
    os.kill(pid, signal.SIGUSR1))) 
thread.start() 

因此,该程序:

import signal 
import os 
import time 

def receive_signal(signum, stack): 
    print 'Received:', signum 

signal.signal(signal.SIGUSR1, receive_signal) 
signal.signal(signal.SIGUSR2, receive_signal) 
signal.signal(signal.SIGALRM, receive_signal) # <-- THIS LINE ADDED 

print 'My PID is:', os.getpid() 

signal.alarm(10)        # <-- THIS LINE ADDED 

while True: 
    print 'Waiting...' 
    time.sleep(3) 

产生此输出:

$ python /tmp/x.py 
My PID is: 3029 
Waiting... 
Waiting... 
Waiting... 
Waiting... 
Received: 14 
Waiting... 
Waiting... 
+0

我在哪里需要将该行放在我的上述脚本中 – user192082107 2013-02-26 03:20:16

+0

在您想要10秒钟启动的时刻,将这些代码片段中的任意一个放入脚本中。例如,你可以把它放在'while'之前。 – 2013-02-26 03:24:50

+0

我不想发送报警信号,只有'USR1',你可以在我当前的脚本中给出这个例子 – user192082107 2013-02-26 03:52:59

24

您可以使用os.kill()

os.kill(os.getpid(), signal.SIGUSR1) 

把你的代码,这在任何地方,你想从发送信号。