2013-02-26 17 views
14

tôi có mã này mà nghe USR1 tín hiệuLàm cách nào để gửi tín hiệu từ chương trình 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) 

này hoạt động khi tôi gửi tín hiệu với kill -USR1 pid

Nhưng làm thế nào tôi có thể gửi cùng một tín hiệu từ bên trong kịch bản python trên để sau 10 giây nó tự động gửi USR1 và cũng nhận được nó, mà không có tôi phải mở hai thiết bị đầu cuối để kiểm tra xem nó?

Trả lời

5

Nếu bạn sẵn sàng để bắt SIGALRM thay vì SIGUSR1, hãy thử:

signal.alarm(10) 

Nếu không, bạn sẽ cần phải bắt đầu một chủ đề:

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

Như vậy, chương trình này:

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) 

sản xuất kết quả này:

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

nơi nào tôi cần đặt dòng đó trong tập lệnh trên – user192082107

+0

Bạn đặt một trong hai đoạn mã đó vào tập lệnh của bạn tại thời điểm bạn muốn đồng hồ 10 giây bắt đầu. Ví dụ, bạn có thể đặt nó trực tiếp trước 'while'. –

+0

Tôi không muốn gửi tín hiệu cảnh báo nhưng 'USR1', bạn có thể đưa ví dụ đó trong tập lệnh hiện tại của tôi – user192082107

24

Bạn có thể sử dụng os.kill():

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

Đặt bất cứ nơi nào trong mã của bạn mà bạn muốn gửi tín hiệu từ.

Các vấn đề liên quan