如何从Python程序发送信号?
我有一段代码,它可以监听USR1信号。
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
信号,并且还能接收到这个信号,而不需要我打开两个终端来检查。
2 个回答
6
如果你想要捕捉到 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...
66