2012-11-23 10 views
6

Tôi đang sử dụng ubuntu 12.04. Có cách nào để bắt sự kiện tạm ngừng bằng Python, tức là nếu máy tính xách tay sắp ngừng hoạt động, hãy thực hiện việc này ...? Cùng một câu hỏi để bắt sự kiện tắt máy.Làm thế nào tôi có thể bắt được một sự kiện đình chỉ hệ thống bằng Python?

+1

này giao dịch với bắt sự kiện log-out. nhưng có thể giúp bạn: http://stackoverflow.com/questions/2490166/detect-user-logout-shutdown-in-python-gtk-under-linux-sigterm-hup-not-rece – theAlse

+0

cảm ơn ... tôi sẽ nhìn vào gnome.ui – koogee

Trả lời

5

tôi nghĩ rằng phương pháp đơn giản nhất là nên sử dụng giao diện DBUS python và lắng nghe cho 'AboutToSleep' và/hoặc 'Ngủ' sự kiện trên giao diện 'org.freedesktop.UPower'

+0

Cảm ơn bạn. Điều này làm việc rất đẹp. – koogee

+0

Tôi dường như không thể tìm thấy tín hiệu cho "Shutdown" trong dbus ??? – koogee

+0

không thể tìm thấy nó là tốt, điều này được sử dụng để được xử lý bởi HALd, nhưng nó là lỗi thời bây giờ – Raber

2

Bạn có thể mở rộng mã này, nó lắng nghe cho các sự kiện từ acpid, cố gắng chỉ in chuỗi nó nhận và tạo ra sự kiện bạn muốn và xem chuỗi trông như thế nào.

s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 
s.connect("/var/run/acpid.socket") 
print "Connected to acpid" 
while 1: 
    for event in s.recv(4096).split('\n'): 
     event=event.split(' ') 
     if len(event)<2: continue 
     print event 
     if event[0]=='ac_adapter': 
      if event[3]=='00000001': #plugged 
       plugged() #Power plugged event 
      else: #unplugged 
       unplugged() #Power unplugged event 
     elif event[0]=='button/power': 
      power_button() #Power button pressed 
     elif event[0]=='button/lid': 
      if event[2]=='open': 
       lid_open() #Laptop lid opened 
      elif event[2]=='close': 
       lid_close() #Laptop lid closed 
+0

cảm ơn. những gì tôi đang tìm kiếm. btw nơi bạn có thể nhận được một danh sách những gì các mã này có nghĩa là gì? ví dụ. 000000081? – koogee

+0

Hm không có ý tưởng một cách trung thực, tôi có những người bằng cách tạo ra các sự kiện và xem những gì chuỗi trông giống như, bạn có thể thử xem trong tài liệu của acpid, đó là daemon gửi những chuỗi. – LtWorf

+0

điều này thật lạ. Có vẻ như tôi chỉ nhận được một trong những dấu hiệu mở/đóng nắp sau khi tạm ngưng/tiếp tục. [ 'xử lý', 'CPU0', '00.000.081', '00000000'] ** [ 'nút/nắp', 'LID0', '00.000.080', '00.000.003'] ** [ 'xử lý' , 'CPU0', '00000081', '00000000'] ['ac_adapter', 'ADP0', '00000080', '00000000'] ['pin', 'BAT0', '00000080', '00000001' ] ['bộ xử lý', 'CPU0', '00000081', '00000000'] – koogee

4

Nếu một ai tình cờ trên cùng một vấn đề, đây là các mã:

#!/usr/bin/env python 

import dbus  # for dbus communication (obviously) 
import gobject # main loop 
from dbus.mainloop.glib import DBusGMainLoop # integration into the main loop 

def handle_resume_callback(): 
    print "System just resumed from hibernate or suspend" 

def handle_suspend_callback(): 
    print "System about to hibernate or suspend" 

DBusGMainLoop(set_as_default=True) # integrate into main loob 
bus = dbus.SystemBus()    # connect to dbus system wide 
bus.add_signal_receiver(   # defince the signal to listen to 
    handle_resume_callback,   # name of callback function 
    'Resuming',      # singal name 
    'org.freedesktop.UPower',   # interface 
    'org.freedesktop.UPower'   # bus name 
) 

bus.add_signal_receiver(   # defince the signal to listen to 
    handle_suspend_callback,   # name of callback function 
    'Sleeping',      # singal name 
    'org.freedesktop.UPower',   # interface 
    'org.freedesktop.UPower'   # bus name 
) 

loop = gobject.MainLoop()   # define mainloop 
loop.run()       # run main loop 
+0

ngoại trừ chỉ các hệ thống máy tính để bàn có dbus – LtWorf

+2

Bắt đầu với phiên bản mới hơn của người lên máy, tín hiệu đã chuyển sang log hệ thống, giao diện mới là "org.freedesktop.login1.Manager", tên bus mới là "org.freedesktop.login1" và tín hiệu mới là "PrepareForSleep" với một đối số: True for suspending, False để tiếp tục. Thông tin thêm tại đây: http://serverfault.com/questions/573379/system-suspend-dbus-upower-signals-are-not-seen – totaam