【问题标题】:How can I send a signal from a python program?如何从 python 程序发送信号?
【发布时间】:2013-02-26 02:50:41
【问题描述】:

我有这个监听 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 并接收它,而无需我打开两个终端来检查它?

【问题讨论】:

    标签: python linux signals


    【解决方案1】:

    你可以使用os.kill():

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

    将它放在代码中要从中发送信号的任何位置。

    【讨论】:

    • 这对于让 docker 容器提交 seppuku 很有用
    【解决方案2】:

    如果您愿意捕捉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...
    

    【讨论】:

    • 我需要将该行放在我上面的脚本中的什么地方
    • 当您希望 10 秒时钟开始时,您将其中任何一个 sn-ps 放入脚本中。例如,您可以将其直接放在 while 之前。
    • 我不想发送警报信号但是USR1,你能在我当前的脚本中举这个例子吗
    • 它和signal.alarm()在同一个地方。您是否尝试将其添加到您的脚本中?
    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 2021-05-24
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多