2013-02-26 4 views
14

J'ai ce code qui écoute usr1 signauxComment envoyer un signal depuis un programme python?

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 quand j'envoie des signaux avec kill -USR1 pid

Mais comment puis-je envoyer le même signal à partir du script python ci-dessus pour que au bout de 10 secondes, il envoie automatiquement USR1 et reçoit également, sans que je dois ouvrir deux terminaux pour le vérifier?

Répondre

5

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

signal.alarm(10) 

Sinon, vous aurez besoin pour commencer 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:

produit cette sortie:

$ python /tmp/x.py 
My PID is: 3029 
Waiting... 
Waiting... 
Waiting... 
Waiting... 
Received: 14 
Waiting... 
Waiting... 
+0

où dois-je mettre cette ligne dans mon script ci-dessus? – user192082107

+0

Vous mettez l'un de ces extraits dans votre script au moment où vous voulez que l'horloge de 10 secondes commence. Par exemple, vous pouvez le placer directement devant le 'while'. –

+0

Je ne veux pas envoyer de signal d'alarme mais 'USR1', pouvez-vous donner cet exemple dans mon script actuel – user192082107

24

Vous pouvez utiliser os.kill():

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

Mettre cela partout dans votre code que vous voulez envoyer le signal.

Questions connexes