web-dev-qa-db-fra.com

Comment envoyer un signal depuis un programme python?

J'ai ce code qui écoute les signaux 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)

Cela fonctionne lorsque j'envoie des signaux avec kill -USR1 pid

Mais comment envoyer le même signal depuis le script ci-dessus python pour qu'après 10 secondes, il envoie automatiquement USR1 et le reçoit également, sans que j'aie à ouvrir deux terminaux pour le vérifier?

19
user192082107

Vous pouvez utiliser os.kill () :

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

Mettez cela n'importe où dans votre code à partir duquel vous souhaitez envoyer le signal.

38
moomima

Si vous êtes prêt à attraper SIGALRM au lieu de SIGUSR1, essayez:

signal.alarm(10)

Sinon, vous devrez démarrer un autre thread:

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

Ainsi, ce programme:

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)

produit cette sortie:

$ python /tmp/x.py 
My PID is: 3029
Waiting...
Waiting...
Waiting...
Waiting...
Received: 14
Waiting...
Waiting...
5
Robᵩ