如何从Python程序发送信号?

36 投票
2 回答
72373 浏览
提问于 2025-04-17 17:07

我有一段代码,它可以监听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

你可以使用 os.kill() 这个函数:

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

把这个放在你代码中想要发送信号的地方。

撰写回答