랩톱을 일시 중지하면 NetworkManager
무선 네트워크가 비활성화됩니다( 에서 nm-manager.c:do_sleep_wake
).
그러나 짧은 기간 동안은 네트워크를 계속 사용할 수 있기를 원합니다( cifs
설치를 제거하지 않으면 복구 시 시스템을 사용할 수 없게 됩니다).
어떻게 만들 수 있나요?NetworkManager
아니요내 네트워크를 비활성화하시겠습니까? 몇 초 동안(또는 무언가가 트리거될 때까지 또는 잠금이 해제될 때까지) 기다릴 수 있습니까?
관련된:pm-utils: 정지 스크립트에 네트워크가 없나요?
디버그 로그:
Feb 8 10:03:23 zenbook NetworkManager[3606]: <debug> [1360314203.373226] [nm-manager.c:3391] upower_sleeping_cb(): Received UPower sleeping signal
Feb 8 10:03:23 zenbook NetworkManager[3606]: <info> sleep requested (sleeping: no enabled: yes)
Feb 8 10:03:23 zenbook NetworkManager[3606]: <info> sleeping or disabling...
Feb 8 10:03:23 zenbook NetworkManager[3606]: <info> (wlan0): now unmanaged
편집: 명확히 하기 위해 스크립트를 입력해도 /etc/pm/sleep.d
도움이 되지 않습니다. 스크립트가 실행되면 네트워크가 이미 비활성화되어 있기 때문입니다.
답변1
표준인지는 모르겠지만 우분투에는 일시 중단 전/재개 후에 /etc/pm/sleep.d
실행되는 스크립트가 있습니다 /usr/lib/pm-utils/sleep.d
. 내 시스템에서 네트워크가 다운된 것 같습니다 /usr/lib/pm-utils/sleep.d/60_wpa_supplicant
.
/etc/pm/sleep.d/10-umount
예를 들어 일시 중단하기 전에 공유를 마운트 해제하는 스크립트를 작성할 수 있습니다 . 이러한 스크립트의 구조는 다음과 같습니다.
#!/bin/sh
#
case "${1}" in
suspend|hibernate)
# your command to umount here
;;
resume|thaw)
# (possibly) your command to mount here
;;
esac
스크립트가 일반 오류를 반환하면 일시 중지가 중단되므로 이 점에 유의하십시오(특히 저처럼 덮개를 닫고 노트북을 멀리 보관하는 경우...). 좀 더 복잡한 내용을 작성해 주신 Samuel Peter의 의견에 감사드립니다.
정의된 특수 값 "해당 없음", "비활성화" 및 "실행할 수 없음"
/usr/lib/pm-utils/pm-functions
중 하나를 반환하여 정지를 중단하지 않고 오류를 반환할 수 있습니다 . pm-functions 스크립트에서 함수 보기$NA
$DX
$NX
hook_exit_status
자동 복구 후에 다시 설치할 수도 있습니다.여기내가 찾은 것 :
일시 중지 또는 최대 절전 모드 중에 설정과 관련된 작업을 수행하려면 /etc/pm/sleep.d에 자신만의 후크를 쉽게 넣을 수 있습니다. 이 디렉토리의 후크는 일시 중지 중에 알파벳 순서로 호출되고(순서를 명확하게 하기 위해 이름이 모두 2자리 숫자로 시작하는 이유입니다) 재개 중에는 역순으로 호출됩니다.
따라서 동일한 스크립트를 넣으면 작동 umount
합니다 mount command
(일시 중지 상태에서는 네트워크를 종료하기 전에 실행되고 재개 상태에서는 네트워크를 종료한 후 실행됩니다).
이것귀하의 질문에 링크 내 해석은 레벨 00-50의 스크립트가 실행되기 전에 NetworkManager가 네트워크를 종료하면 이는 버그라는 것입니다. 적어도 연결이 시스템 연결로 표시된 경우(네트워크 설정->옵션- >ID- > 다른 사용자가 사용할 수 있음).
답변2
@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(...)
(다음 절전 또는 종료를 위해) 을 생성 할 수 있습니다 .
Python(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 계정 연결을 끊기 위해 정확히 동일한 방법을 사용한다는 것을 알 수 있습니다.
공식 freedesktop 문서도 참조하세요.억제제 잠금그리고logind
D 버스 API.
답변3
nm
기기가 종료되는 이유를 알아보세요 .
dbus-monitor --system &
nmcli g logging level DEBUG
--> trigger suspend
(내 경우(Fedora 20)처럼) systemd
신호가 트리거되면 dbus 구성에서 신호 전달을 거부할 수 있습니다.
---- /etc/dbus-1/system.d/99-my-suspend.conf ---
<busconfig>
<policy user="root">
<deny receive_interface="org.freedesktop.login1.Manager"
receive_type="signal"
receive_member="PrepareForSleep"/>
</policy>
</busconfig>
불행하게도 이러한 규칙은 매우 세밀하지 않으며 PrepareForSleep
다른 프로세스의 신호도 차단합니다.
답변4
서비스를 일시 중단하기 전에 종료하고, 재개한 후 다시 시작해 보세요. 그렇게:
http://oleeekchoff.blogspot.ie/2012/05/restart-modulesservices-after.html