@ensc의 말을 바탕으로 D-Bus (시스템 세션) 신호를 직접들을 수 있습니다. org.freedesktop.login1.Manager
인터페이스 의 일반적인 워크 플로우는 다음과 같습니다.
- 다음과 같이 시스템 절전 모드를 종료합니다 (종료 될 수도 있음).
Inhibit(what, who, why, mode)
what
: sleep
또는shutdown:sleep
who
: unmount_cifs
또는 스크립트라고 부르는 모든 것
why
: unmounting cifs X before suspend ...
또는 동등한
mode
: delay
최대 억제 5 초 (기본값) 또는 block
무기한 차단 (첫 번째 방법을 권장합니다. 스크립트가 중단되면 노트북은 절대 절전 모드로 전환되지 않습니다.)
- 이것은 잠금을 '유지'하는 파일 디스크립터를 리턴합니다.
- 지금 당신은 신호를들을
PrepareForSleep
True
일시 중지 또는 최대 절전 모드로 돌아가 거나 False
재개 및 해동 할 때 반환 됩니다.
PrepareForShutdown
, True
종료하려고 할 때 반환 하고 False
전원을 다시 켤 때 반환해야합니다 (대신 나에게 의미가없는 False
반환과 동시에 반환 True
되므로 False
여기서는 무시할 것입니다. 아마도 자동 마운트 스크립트가 있습니다. 어쨌든 시스템 시작시?)
True
신호 처리 (예 : 마운트 해제)를 마치고 나면 파일 설명자를 닫아 ()로 잠금을 해제하여 Inhibit(...)
5 초 동안 기다리지 않고 가능한 빨리 기계가 절전 모드 또는 종료 될 수 있습니다. 또는 block
모드에 있을 때 무한정 )
- 당신은 처리 할 수 있습니다
False
(첫번째 어쩌면 네트워크에 돌아 오기를 기다리는) 다시 마운트 한 다음에 새로운 잠금 생성에 의해 신호 (이력서 / 해동) Inhibit(...)
(다음 수면 또는 종료를 들어)
파이썬 (2.7)에서는 다음과 같이 보일 수 있습니다 :
#!/usr/bin/env python
import os, atexit, dbus, gobject
from dbus.mainloop import glib
def login1ManagerDBusIface():
system_bus = dbus.SystemBus()
proxy = system_bus.get_object( 'org.freedesktop.login1',
'/org/freedesktop/login1' )
login1 = dbus.Interface( proxy, 'org.freedesktop.login1.Manager')
return login1
def sleepShutdownInhibit():
login1 = login1ManagerDBusIface()
fd = login1.Inhibit( 'shutdown:sleep', 'unmount_cifs',
'Unmounting before suspend/shutdown ...',
'delay' )
return fd
def take_lock():
global FD
FD = sleepShutdownInhibit()
def remove_lock():
global FD
if FD:
os.close( FD.take() )
FD = None
def signal_handler(boolean, member=None):
if boolean: ## going to suspend/hibernate or shutdown
## PLACE YOUR UNMOUNT STUFF HERE
remove_lock()
else: ## resume/thaw
if member == 'PrepareForSleep':
## PLACE YOUR MOUNT STUFF HERE
take_lock()
if __name__ == '__main__':
take_lock()
atexit.register(remove_lock)
login1 = login1ManagerDBusIface()
for signal in ['PrepareForSleep', 'PrepareForShutdown']:
login1.connect_to_signal(signal, signal_handler,
member_keyword='member')
glib.DBusGMainLoop(set_as_default=True)
loop = gobject.MainLoop()
loop.run()
이 요지 에서는 Pidgin을 둘러싼 래퍼를 찾아서 동일한 접근 방식을 사용하여 절전 및 종료시 IM 계정의 연결을 끊습니다.
Inhibitor Locks 및 logind
D-Bus API 에 대한 공식 freedesktop 설명서를 참조하십시오 .