2012-11-23 10 views
6

Używam Ubuntu 12.04. Czy istnieje sposób na przechwycenie zdarzenia zawieszenia w Pythonie, tzn. Czy laptop zawiesi, zrób to ...? To samo pytanie dotyczące przechwytywania zdarzenia zamknięcia.Jak mogę złapać zdarzenie zawieszenia systemu w Pythonie?

+1

ten dotyczy połowu zdarzenie wylogowanie. ale może ci pomóc: http://stackoverflow.com/questions/2490166/detect-user-logout-shutdown-in-python-gtk-under-linux-sigterm-hup-not-rece – theAlse

+0

dzięki ... będę spójrz na gnome.ui – koogee

Odpowiedz

5

myślę najprostszą metodą będzie użycie DBUS python interfejsu i nasłuchiwać „AboutToSleep” i/lub „Śpiąca” zdarzenia na interfejsie „org.freedesktop.UPower”

+0

Dziękuję. To działało pięknie. – koogee

+0

Nie mogę znaleźć sygnału do "Shutdown" w dbus? – koogee

+0

nie może go znaleźć, to było obsługiwane przez HALd, ale jest już przestarzałe. – Raber

2

Można rozszerzyć ten kod, to nasłuchuje Zdarzenia z acpid, spróbuj po prostu wydrukować ciąg, który otrzymuje i wygeneruj zdarzenie, które chcesz i zobacz, jak wygląda ciąg.

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

dzięki. to, czego szukałem. btw gdzie można uzyskać listę tego, co oznaczają te kody? na przykład 000000081? – koogee

+0

Hm nie mam pojęcia szczerze, dostałem je poprzez generowanie zdarzeń i zobaczenie jak ten łańcuch wyglądał, możesz spróbować zobaczyć w dokumentacji acpid, który jest demonem wysyłającym te struny. – LtWorf

+0

to jest dziwne. Wygląda na to, że otrzymuję tylko jeden z sygnałów otwarcia/zamknięcia pokrywy po zawieszeniu/wznowieniu. [ 'procesor', 'CPU0', '00000081', '00000000'] ** [ '/ przycisk pokrywa', 'LID0', '00000080', '00000003'] ** [ 'procesor' , 'CPU0', '00000081', '00000000'] ['ac_adapter', 'ADP0', '00000080', '00000000'] ['battery', 'BAT0', '00000080', '00000001' ] ['procesor', 'CPU0', '00000081', '00000000'] – koogee

4

Jeśli ktoś natknie się na ten sam problem, oto kod:

#!/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

oprócz tego, że tylko systemy stacjonarne mają dbus – LtWorf

+2

Począwszy od nowszych wersji upower, sygnał został przeniesiony do loginu systemd, nowy interfejs to "org.freedesktop.login1.Manager", nowa nazwa magistrali to "org.freedesktop.login1" a nowym sygnałem jest "PrepareForSleep" z argumentem: True dla zawieszenia, false dla wznowienia. Więcej informacji tutaj: http://serverfault.com/questions/573379/system-suspend-dbus-upower-signals-are-not-seen – totaam