NetworkManager: ปิดการใช้งานเครือข่ายเมื่อส่งระบบเข้าสู่โหมดสลีป


11

เมื่อฉันระงับโน้ตบุ๊คของฉัน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ไม่ช่วยได้เนื่องจากเครือข่ายถูกปิดใช้งานทันทีที่สคริปต์ทำงาน


ลองดูที่ตัวเลือกการจัดการพลังงานและมองหาสิ่งที่มีผลต่อการ "ปิดการใช้งานเครือข่ายเมื่อคอมพิวเตอร์ถูกระงับ"
โจเซฟอาร์

ไม่มีสิ่งนั้น ฉันใช้ xmonad กับ Gnome 3
C-Otto

คุณหมายถึงคุณกำลังแทนที่ GNOME Shell ด้วย xmonad แต่จะไม่เปลี่ยนแปลงอะไรอีกหรือ? ถ้าเป็นเช่นนั้นเลือกการใช้พลังงานที่มีอยู่ใน "อำนาจ" gnome-control-centerของบานหน้าต่าง
strugee

ฉันรู้ว่า. ไม่มีสิ่งที่คุณพูด
C-Otto

คำถามที่คุณถามนั้นเป็นปัญหา XYเล็กน้อยคำตอบที่ฉันให้ไว้กับคุณเมื่อปีที่แล้วunix.stackexchange.com/questions/62157/… , wrt การสร้าง hooks งานแบบกำหนดเองที่เชื่อมโยงกับการระงับการใช้พลังงาน / การดำเนินการต่อเป็นวิธีที่ ไปที่นี่ การพยายามหนุนเครือข่ายให้ยาวขึ้นอีกหน่อยนั้นไม่ใช่วิธีที่เหมาะสมในการแก้ไขปัญหานี้
slm

คำตอบ:


4

ผมไม่ทราบว่าเป็นมาตรฐาน แต่ในอูบุนตูมีสคริปต์ที่จะดำเนินการก่อนที่จะระงับ / หลังประวัติส่วนตัวในและใน/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

โปรดสังเกตว่าถ้าสคริปต์ส่งคืนข้อผิดพลาดทั่วไปการระงับถูกยกเลิกดังนั้นโปรดจัดการเรื่องนี้ (โดยเฉพาะอย่างยิ่งคุณเช่นฉันใช้เพื่อปิดฝาและเก็บแล็ปท็อปไว้ ... ) ในการเขียนสคริปต์สิ่งที่ซับซ้อนมากขึ้นขอบคุณซามูเอลปีเตอร์สำหรับความคิดเห็นของเขา:

คุณสามารถส่งคืนข้อผิดพลาดโดยไม่ยกเลิกการระงับได้โดยส่งคืนหนึ่งในค่าพิเศษที่กำหนดใน/usr/lib/pm-utils/pm-functions: $NA คือ "ไม่เกี่ยวข้อง", $DX"ปิดการใช้งาน" และ$NX"ไม่สามารถเรียกใช้งานได้" ดูhook_exit_statusฟังก์ชันในสคริปต์ฟังก์ชัน pm

คุณสามารถนับใหม่ได้หลังจากดำเนินการต่อโดยอัตโนมัติ จากที่นี่ฉันพบว่า:

หากคุณต้องการทำบางสิ่งบางอย่างโดยเฉพาะกับการตั้งค่าของคุณในระหว่างการหยุดชั่วคราวหรือไฮเบอร์เนตคุณสามารถใส่ฮุกของคุณเองใน /etc/pm/sleep.d hooks ในไดเรกทอรีนี้จะถูกเรียกตามลำดับตัวอักษรระหว่างการระงับ (นั่นคือเหตุผลที่ชื่อของพวกเขาทั้งหมดเริ่มต้นด้วย 2 หลักเพื่อให้การสั่งซื้อชัดเจน) และในลำดับย้อนกลับในระหว่างการดำเนินการต่อ

ดังนั้นในสคริปต์เดียวกันumountและmount commandควรทำงาน (ในระงับมันจะถูกดำเนินการก่อนที่จะปิดเครือข่ายและดำเนินการต่อหลังจากนั้น)

การเชื่อมโยงในคำถามของคุณ เป็นที่เปิดเผย; ฉันตีความว่าถ้า NetworkManager ปิดเครือข่ายก่อนสคริปต์ที่ระดับ 00-50 จะทำงานเป็นข้อผิดพลาด --- อย่างน้อยถ้าการเชื่อมต่อถูกทำเครื่องหมายว่าเป็นการเชื่อมต่อระบบ (ในการตั้งค่าเครือข่าย -> ตัวเลือก -> เอกลักษณ์ - > ทำให้ผู้ใช้รายอื่นพร้อมใช้งาน)


+1 pm-utilsควรพร้อมใช้งานใน distros กระแสหลักทั้งหมด
goldilocks

1
โปรดทราบว่าคุณสามารถส่งคืนข้อผิดพลาดโดยไม่ยกเลิกการระงับโดยส่งคืนหนึ่งในค่าพิเศษที่กำหนดไว้ใน / usr / lib / pm-utils / pm-functions: $NAคือ "ไม่สามารถใช้งานได้" $DXคือ "ปิดใช้งาน" และ$NX"ไม่สามารถใช้งานได้" . ดูhook_exit_statusฟังก์ชันในสคริปต์ฟังก์ชัน pm
Samuel Peter

หมายเหตุ: คำตอบนี้เพิ่มเติมให้กับ OP ใน Q นี้: unix.stackexchange.com/questions/62157/ …ฉันคิดว่าเขากำลังมองหาอย่างอื่นที่ไม่มี NetworkManager wrt
slm

ดังที่ฉันได้กล่าวไปแล้วในคำถามที่อ้างอิงฉันไม่มีเครือข่ายใด ๆ ในสคริปต์ (เช่น 10-umount) ทันทีที่สคริปต์ทำงานใด ๆ เครือข่ายจะหยุดทำงาน
C-Otto

1
ฉันจะตรวจสอบsystem connectionคุณสมบัติ แก้ไข: system connectionแล้วมันเป็น
C-Otto

3

จากสิ่งที่ @ensc พูดคุณสามารถฟังสัญญาณ D-Bus (ระบบเซสชัน) แทนได้เอง เวิร์กโฟลว์ทั่วไปพร้อมorg.freedesktop.login1.Managerอินเทอร์เฟซจะเป็น:

  1. ยับยั้งการนอนหลับของระบบ (หรืออาจจะปิดระบบ) ด้วย Inhibit(what, who, why, mode)
    • what: sleepหรือshutdown:sleep
    • who: unmount_cifsหรืออะไรก็ตามที่คุณจะเรียกสคริปต์ของคุณ
    • why: unmounting cifs X before suspend ...หรือเทียบเท่า
    • mode: delayเพื่อยับยั้งการสูงสุด จาก 5s (ค่าเริ่มต้น) หรือblockบล็อกแบบไม่มีกำหนด (ฉันอยากจะแนะนำก่อนถ้าสคริปต์ของคุณหยุดทำงานโน้ตบุ๊กของคุณจะไม่เข้าสู่โหมดสลีป)
    • ส่งคืนไฟล์ descriptor ที่ 'ล็อค'
  2. ตอนนี้คุณฟังสัญญาณแล้ว
    • PrepareForSleepซึ่งจะส่งกลับTrueเมื่อกำลังจะหยุดหรือไฮเบอร์เนตและFalseเมื่อกลับมาทำงานและละลาย)
    • PrepareForShutdownซึ่งจะส่งกลับTrueเมื่อกำลังจะปิดและควรกลับมาFalseเมื่อเปิดเครื่องอีกครั้ง (แต่จะกลับมาFalseพร้อมกันในเวลาเดียวกันTrueซึ่งจะกลับมาไม่เหมาะสมกับฉันดังนั้นฉันจะไม่สนใจFalseส่วนที่นี่คุณอาจมีสคริปต์การติดตั้งอัตโนมัติบางชนิด ในการเริ่มระบบอย่างไรก็ตามคุณ?)
  3. ทันทีที่เสร็จสิ้นการจัดการTrueสัญญาณ (เช่นการเลิกเมานท์) คุณจะปลดล็อคโดยการปิดไฟล์ descriptor (คืนโดยInhibit(...)) เพื่อให้เครื่องสามารถเข้าสู่โหมดสลีปหรือปิดเครื่องได้เร็วที่สุดโดยไม่ต้องรอทั้ง 5s หรือไม่สิ้นสุดเมื่ออยู่ในblockโหมด)
  4. คุณสามารถจัดการ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()

ในส่วนสำคัญนี้คุณจะพบเสื้อคลุมของฉันรอบพิดจิ้นเพื่อตัดการเชื่อมต่อบัญชี IM เมื่อเข้าสู่โหมดสลีและปิดโดยใช้วิธีการเดียวกันทั้งหมด

ดูเพิ่มเติมเอกสารอย่างเป็นทางการใน freedesktop ยับยั้งล็อคและlogindD-Bus API


ฉันกำลังทำสิ่งที่คล้ายกัน (สำหรับunix.stackexchange.com/q/337853 ) สิ่งนี้ฟังดูมีแนวโน้ม แต่แน่นอนว่ามันกำลังแข่งกับ NetworkManager ซึ่งกำลังทำสิ่งเดียวกันอยู่ใช่ไหม จะเกิดอะไรขึ้นหากสคริปต์ที่ขึ้นกับเครือข่ายของฉันใช้เวลานานกว่าที่ NetworkManager ใช้เพื่อหยุดเครือข่าย
David

พยายามออกมา ( github.com/davidn/av ) และดูเหมือนว่าจะใช้งานได้!
เดวิด

1

คุณสามารถลองค้นหาสาเหตุที่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สัญญาณสำหรับกระบวนการอื่นด้วย


0

ลองปิดบริการก่อนหยุดและเริ่มต้นอีกครั้งหลังจากทำงานต่อ เช่นนั้น:

http://oleeekchoff.blogspot.ie/2012/05/restart-modulesservices-after.html


คุณหมายถึงอะไร ฉันควรหยุดบริการผู้จัดการเครือข่ายหรือไม่ ฉันไม่เข้าใจว่าจะช่วยได้อย่างไร
C-Otto

ยินดีต้อนรับสู่ Stack Exchange! กรุณาอย่าให้คำตอบที่เป็นลิงค์เดียวโดยทั่วไป หากเป็นไปได้คุณควรแปลความหมายเนื้อหาที่คุณเชื่อมโยงมิฉะนั้นการคัดลอกและวางจะไม่เป็นผลตราบใดที่คุณยังระบุ และอีกครั้งยินดีต้อนรับ!
strugee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.