स्लीप (उर्फ सस्पेंड, हाइबरनेट) पर ट्रिगर करने के लिए सिस्टमड उपयोगकर्ता सेवा कैसे चलाएं?


17

विभिन्न स्रोतों के आधार पर मैंने एक साथ सिल दिया है ~/.config/systemd/user/screenlock.service:

[Unit]
Description=Lock X session
Before=sleep.target

[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/xautolock -locknow

[Install]
WantedBy=sleep.target

मैंने इसका उपयोग करके सक्षम किया है systemctl --user enable screenlock.service। लेकिन रिबूट करने के बाद, लॉग इन करना, निलंबित करना और फिर से शुरू करना ( systemctl suspendढक्कन के साथ और बंद करके दोनों का परीक्षण किया गया) स्क्रीन लॉक नहीं है और इसमें कुछ भी नहीं हैjournalctl --user-unit screenlock.serviceमैं क्या गलत कर रहा हूं?

चल रहे DISPLAY=:0 /usr/bin/xautolock -locknowस्क्रीन उम्मीद के मुताबिक लॉक।

$ systemctl --version
systemd 215
+PAM -AUDIT -SELINUX -IMA -SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ +SECCOMP -APPARMOR
$ awesome --version
awesome v3.5.5 (Kansas City Shuffle)
 • Build: Apr 11 2014 09:36:33 for x86_64 by gcc version 4.8.2 (nobody@)
 • Compiled against Lua 5.2.3 (running with Lua 5.2)
 • D-Bus support: ✔
$ slim -v
slim version 1.3.6

अगर मैं systemctl --user start screenlock.serviceतुरंत स्क्रीन लॉक चलाता हूं और मुझे लॉग संदेश मिलता है journalctl --user-unit screenlock.service, तो ExecStartस्पष्ट रूप से सही है।

प्रासंगिक .xinitrcअनुभाग :

xautolock -locker slock &

एक ही फ़ाइल काम के साथ एक सिस्टम सेवा बनाना (जो slockफिर से शुरू होने पर सक्रिय है):

# ln -s "${HOME}/.config/systemd/user/screenlock.service" /usr/lib/systemd/system/screenlock.service
# systemctl enable screenlock.service
$ systemctl suspend

लेकिन मैं $HOMEकई कारणों से बाहर के उपयोगकर्ता-विशिष्ट फ़ाइल को जोड़ना नहीं चाहता :

  • उपयोगकर्ता सेवाओं को स्पष्ट रूप से सिस्टम सेवाओं से अलग किया जाना चाहिए
  • सुपरयूजर विशेषाधिकारों का उपयोग किए बिना उपयोगकर्ता सेवाओं को नियंत्रित किया जाना चाहिए
  • कॉन्फ़िगरेशन को आसानी से नियंत्रित किया जाना चाहिए

मैं विंडो मैनेजर के रूप में कमाल का उपयोग कर रहा हूं , और SLIM लॉगिन मैनेजर के रूप में । मैं आर्क द्वारा परिभाषित पूर्ण डेस्कटॉप वातावरण का उपयोग नहीं कर रहा हूं , और लिनक्स / भयानक जैसा कि डेस्कटॉप वातावरण में विकिपीडिया द्वारा परिभाषित है । लिनक्स के लिए "डेस्कटॉप मैनेजर" जैसा कुछ भी प्रतीत नहीं होता है।
l0b0

उपयोगकर्ता सेवाएँ सत्र के बाहर चलाई जाती हैं, इसलिए आपका सत्र डेटा उनके लिए उपलब्ध नहीं है; आप इसके लिए एक मानक सेवा फ़ाइल का उपयोग करने से बेहतर हो सकते हैं: कम से कम वैसे भी परीक्षण करने के लिए ...
jasonwryan

@ajonwryan निश्चित रूप से अगर सेवा शुरू हो गई थी तो मुझे जर्नल में किसी प्रकार का त्रुटि संदेश दिखाई देगा?
l0b0

मुझे नहीं पता: systemd-userअभी भी बहुत परतदार है; सत्र के भाग के रूप में काम करने के लिए इसे प्राप्त करने के दृष्टिकोण से मैं समस्या को कम करने में मदद करूंगा; बस इतना ही कह सकता हूं।
jasonwryan

हालांकि यह एक सही समाधान नहीं है (इसे अभी भी रूट अनुमतियों के साथ प्रबंधित करने की आवश्यकता होगी), आप बस मैन्युअल रूप से कुछ भी डालने /etc/systemd/system/या उपयोग $HOME/.local/systemd/systemकरने से बच सकते हैं /usr। जैसा कि @jasonwryan ने उल्लेख किया है, उपयोगकर्ता सत्र अभी भी उत्पादन-गुणवत्ता नहीं माना जाता है; लेकिन वे करीब आ रहे हैं।
HalosGhost

जवाबों:


20

sleep.targetसिस्टम सेवाओं के लिए विशिष्ट है। इसका कारण है, sleep.targetएक जादू लक्ष्य नहीं है जो सोने के लिए जाने पर स्वचालित रूप से सक्रिय हो जाता है। यह सिर्फ एक नियमित लक्ष्य है जो सिस्टम को सोने के लिए डालता है - इसलिए निश्चित रूप से 'उपयोगकर्ता' उदाहरणों के बराबर नहीं होगा। (और दुर्भाग्य से वर्तमान में 'उपयोगकर्ता' के उदाहरणों में सिस्टमवाइड सेवाओं पर निर्भर रहने का कोई तरीका नहीं है।)

(वह और वहाँ पूरे "हार्डकॉन्गिंग $ डिसप्ले" व्यवसाय है। हर बार जब आप किसी ओएस में हार्डकोड सत्र मापदंडों को कहते हैं, जो कि बहु-उपयोगकर्ता / बहु-सीट यूनिक्स पर आधारित है, रूट एक बिल्ली का बच्चा मारता है।)

ऐसा करने के दो अच्छे तरीके हैं (मैं दूसरा सुझाव देता हूं):

विधि 1

एक सिस्टम सेवा (या एक सिस्टम-स्लीप (8) हुक) बनाएं जो सिस्टमड-लॉगइंड को "लॉक ऑल सेशन" सिग्नल प्रसारित करता है जब सिस्टम सो जाता है:

ExecStart=/usr/bin/loginctl lock-sessions

फिर, अपने X11 सत्र के भीतर (यानी ~ / .xinitrc से), कुछ ऐसा चलाएं जो संकेत पर प्रतिक्रिया करता है:

सिस्टमड -लॉक-हैंडलर सॉक एंड
XSS ताला --ignore नींद slock &

(GNOME, Cinnamon, KDE, Enlightenment पहले से ही मूल रूप से इसका समर्थन करते हैं।)

विधि 2

अपने X11 सत्र के भीतर, कुछ ऐसा चलाएं जो सिस्टम के सोने के लिए सीधे देखता है, जैसे कि systemd-logind के "अवरोधक" में हुक करके।

पूर्वोक्त xss- लॉक वास्तव में बिल्कुल ऐसा करता है, यहां तक ​​कि स्पष्ट "लॉक ऑल" सिग्नल के बिना भी, इसलिए यह इसे चलाने के लिए पर्याप्त है:

xss- लॉक झुंड और

slockजैसे ही यह सिस्टमड-लॉगइंड को कंप्यूटर को निलंबित करने की तैयारी करता है, यह चल जाएगा ।


क्या आप कृपया प्रबोधन और दूसरों के मूल समर्थन पर थोड़ा विस्तार कर सकते हैं? यह स्पष्ट नहीं है कि वास्तव में वे उत्तर से देशी समर्थन क्या करते हैं।
पावेल Paमरदा

@ Pavel "imerda: systemd-logind से "लॉक सेशन" संकेत ((संपूर्ण अनुभाग इसके बारे में है ...) इसके अलावा, मैं गलत था, e19 वास्तव में इसका समर्थन नहीं करता है।
user1686

E19 के बारे में जानकारी के लिए धन्यवाद। जवाब में अभी भी स्पष्टीकरण का अभाव है कि वास्तव में गनोम और अन्य क्या समर्थन करते हैं। सिस्टमड के डी-बस सिग्नल को सुनना (यहां तक ​​कि वहां नहीं लिखा गया है) एक बात है, प्रतिक्रिया में क्या कार्रवाई की जाती है और उपयोगकर्ता क्या कार्रवाई कर सकता है और कैसे किया जा सकता है। इसके अलावा सिस्टम-लॉक-हैंडलर क्या करता है और यह कहां से आता है, इसकी कोई जानकारी नहीं है।
पावेल Paमरदा

xss-lockAUR में है, इसलिए इसे मैन्युअल रूप से बनाने की कोई आवश्यकता नहीं है।
l0b0

यह डेबियन परीक्षण के तहत खूबसूरती से काम करता है। पोस्ट करने का शुक्रिया। यह काफी निराशाजनक है कि systemd उपयोगकर्ता सेवाओं को सिस्टम सेवाओं पर निर्भर होने की अनुमति नहीं देता है ...
cgogolin

-1

systemd-lock-handlerएक पायथन लिपि है जो इसे पूरा कर सकती है: https://github.com/grawity/code/blob/master/desktop/systemd-lock-handler

#!/usr/bin/env python
# systemd-lock-handler -- proxy between systemd-logind's "Lock" signal and your
#   favourite screen lock command

from __future__ import print_function
import os, sys, dbus, dbus.mainloop.glib
from gi.repository import GLib

def trace(*args):
    global arg0
    print("%s:" % arg0, *args)

def setup_signal(signal_handler):
    global session_id
    bus = dbus.SystemBus()
    manager = bus.get_object("org.freedesktop.login1", "/org/freedesktop/login1")
    # yecch
    manager = dbus.Interface(manager, "org.freedesktop.login1.Manager")
    session_path = manager.GetSession(session_id)
    session = bus.get_object("org.freedesktop.login1", session_path)
    session.connect_to_signal("Lock", signal_handler)

def handler_dbus_fdo():
    trace("locking session using DBus")
    bus = dbus.SessionBus()
    screensaver = bus.get_object("org.freedesktop.ScreenSaver", "/ScreenSaver")
    screensaver.Lock()

def handler_external():
    global lock_command
    trace("locking session using %r" % lock_command[0])
    os.spawnvp(os.P_NOWAIT, lock_command[0], lock_command)

def main():
    global arg0, lock_command, session_id
    arg0 = sys.argv[0].split("/")[-1]
    lock_command = sys.argv[1:] or ["--dbus"]
    try:
        session_id = os.environ["XDG_SESSION_ID"]
    except KeyError:
        print("error: $XDG_SESSION_ID not set; are you using pam_systemd?",
            file=sys.stderr)
        sys.exit(1)
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
    if lock_command == ["--dbus"]:
        trace("using freedesktop.org DBus API")
        setup_signal(handler_dbus_fdo)
    else:
        trace("using external command %r" % lock_command[0])
        setup_signal(handler_external)
    trace("waiting for lock signals on session %s" % session_id)
    try:
        loop = GLib.MainLoop()
        loop.run()
    except KeyboardInterrupt:
        sys.exit(0)

main()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.