Подтвердить что ты не робот

Как я могу отправить сигнал из программы 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 script, чтобы через 10 секунд он автоматически отправил USR1, а также получил его, без необходимости открывать два терминала для его проверки?

4b9b3361

Ответ 1

Вы можете использовать os.kill():

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

Поместите это в любом месте вашего кода, из которого вы хотите отправить сигнал.

Ответ 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...