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?
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.
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...