কীভাবে সিস্টেমেড ইউজার পরিষেবাটি ঘুমের উপরে চালিত করতে হবে (যেমন, সাসপেন্ড, হাইবারনেট)?


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। তবে রিবুট, লগ ইন, সাসপেন্ড এবং পুনরায় চালু করার পরে (idাকনাটি দিয়ে 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বেশ কয়েকটি কারণে বাইরে কোনও ব্যবহারকারী-নির্দিষ্ট ফাইল যুক্ত করতে চাই না :

  • ব্যবহারকারী পরিষেবাগুলি স্পষ্টভাবে সিস্টেম পরিষেবাদি থেকে পৃথক করা উচিত
  • ব্যবহারকারীর পরিষেবাগুলিকে অতিরিক্ত ব্যবহারকারীর সুবিধাগুলি ব্যবহার না করে নিয়ন্ত্রণ করা উচিত
  • কনফিগারেশন সহজে সংস্করণ নিয়ন্ত্রিত করা উচিত

আমি উইন্ডো ম্যানেজার হিসাবে দুর্দান্ত এবং এসএমআইএম লগইন পরিচালক হিসাবে ব্যবহার করছি । আমি একটি পূর্ণ ব্যবহার করছি না ডেক্সটপ পরিবেশকে যেমন আর্চ দ্বারা সংজ্ঞায়িত , এবং Linux / যেমন সন্ত্রস্ত ডেস্কটপ পরিবেশে উইকিপিডিয়া সংজ্ঞায়িত । লিনাক্সের জন্য "ডেস্কটপ ম্যানেজার" এর মতো কিছু নেই বলে মনে হয়।
l0b0

ব্যবহারকারী পরিষেবাগুলি সেশনের বাইরে চালানো হয়, সুতরাং আপনার সেশন ডেটা তাদের কাছে উপলভ্য নয়; আপনি
এটির

@ জেসনওয়ারিয়ান নিশ্চয়ই যদি জার্নালে কোনও ধরণের ত্রুটি বার্তা দেখতে পেতাম তবে পরিষেবাটি চালু করা হয়েছিল?
l0b0

আমি জানি না: systemd-userএখনও খুব চঞ্চল; আমি বর্ণিত পদ্ধতির মাধ্যমে এটি অধিবেশনটির অংশ হিসাবে কাজ করা বিষয়টি সমস্যা সঙ্কুচিত করতে সহায়তা করবে; আমি এটাই বলতে পারি।
জেসনওয়ারিয়ান

যদিও এটি একটি নিখুঁত সমাধান নয় (এটি এখনও মূল অনুমতি দিয়ে পরিচালনা করা প্রয়োজন), আপনি কেবল ব্যবহার করতে পারেন /etc/systemd/system/বা ম্যানুয়ালি $HOME/.local/systemd/systemকোনও কিছু এড়াতে এড়াতে পারেন /usr। @ জেসনওয়ারিয়ান উল্লিখিত হিসাবে, ব্যবহারকারী সেশনগুলি এখনও উত্পাদন-মানের হিসাবে বিবেচিত হয় না; তবে তারা আরও কাছে আসছে
HalosGhost

উত্তর:


20

sleep.targetসিস্টেম পরিষেবাগুলির জন্য নির্দিষ্ট। কারণটি হ'ল, sleep.targetকোনও জাদু লক্ষ্য নয় যা ঘুমাতে যাওয়ার সময় স্বয়ংক্রিয়ভাবে সক্রিয় হয়। এটি শুধু একটি নিয়মিত লক্ষ্য যে রাখে তাই অবশ্যই 'ব্যবহারকারী' দৃষ্টান্ত একটি সমতুল্য হবে না - ঘুম সিস্টেম। (এবং দুর্ভাগ্যক্রমে 'ব্যবহারকারী' উদাহরণগুলির বর্তমানে সিস্টেমওয়াইড পরিষেবাগুলির উপর নির্ভর করার কোনও উপায় নেই))

(এটি, এবং পুরো "হার্ডকোডিং $ DISPLAY" ব্যবসা রয়েছে Every আপনি যখন ভারী ভারী মাল্টি-ইউজার / মাল্টি-সিট ইউনিক্সের উপর ভিত্তি করে কোনও ওএসে সেশন প্যারামিটারগুলি হার্ডকোড করেন, তখন একটি বিড়ালছানা মারা যায়))

সুতরাং এটি করার জন্য দুটি ভাল উপায় রয়েছে (আমি দ্বিতীয়টির পরামর্শ দিই):

পদ্ধতি 1

একটি সিস্টেম পরিষেবা তৈরি করুন (বা সিস্টেমড্লিপ-স্লিপ (8) হুক) যা সিস্টেমড-লগইন্ড সম্প্রচারকে "সমস্ত সেশন লক করুন" সংকেত দেয় যখন সিস্টেমটি ঘুমাতে যায়:

ExecStart=/usr/bin/loginctl lock-sessions

তারপরে, আপনার এক্স 11 সেশনের মধ্যে (যেমন ~ / .xinitrc থেকে), এমন কিছু চালান যা সংকেতের প্রতিক্রিয়া দেখায়:

সিস্টেমড -লক-হ্যান্ডলার স্লো এবং
এক্সএসএস
 -লক

(জিনোম, দারুচিনি, কেডিএ, আলোকায়ন ইতিমধ্যে এটিকে স্থানীয়ভাবে সমর্থন করে))

পদ্ধতি 2

আপনার এক্স 11 সেশনের মধ্যে এমন কিছু চালান যা সিস্টেমে ঘুমাতে যাওয়া সিস্টেমের জন্য সরাসরি নজর রাখে, যেমন সিস্টেমড-লগইন্ডের "ইনহিবিটার্স" এ .ুকে পড়ে।

পূর্বোক্ত xss- লকটি প্রকৃতপক্ষে ঠিক এমনটি করে, এমনকি "সমস্ত লক" সংকেত ব্যতীত, তাই এটি চালানো যথেষ্ট:

এক্সএস -লক স্লোক এবং

এটি slockকম্পিউটারটি স্থগিত করার জন্য সিস্টেমড-লগইন্ড প্রস্তুত হওয়ার সাথে সাথে এটি চলবে।


আপনি দয়া করে আলোকিতকরণ এবং অন্যের স্থানীয় সমর্থন সম্পর্কে কিছুটা ব্যাখ্যা করতে পারেন? তারা উত্তর থেকে স্থানীয়ভাবে সমর্থন করে তা পরিষ্কার নয়।
পাভেল Šিমেরদা

@ পাভেলিমারদা: সিস্টেমড-লগইন্ডের "লক সেশন" সিগন্যাল (... পুরো বিভাগটি এটি সম্পর্কে ...) এছাড়াও, আমি ভুল ছিলাম, ই 19 আসলে এটি সমর্থন করে না।
user1686

E19 সম্পর্কে তথ্যের জন্য ধন্যবাদ। জनोম এবং অন্যান্যরা ঠিক কী সমর্থন করে সে সম্পর্কে উত্তরের এখনও ব্যাখ্যা নেই। সিস্টেমডের ডি-বাস সিগন্যাল শুনতে (এমনকি এটি সেখানে লেখা হয়নি) একটি জিনিস, প্রতিক্রিয়াতে কোন ক্রিয়াগুলি করা হয় এবং কী কী কর্ম এবং কীভাবে ব্যবহারকারীকে কনফিগার করা যায় তা অন্যটি। সিস্টেমড-লক-হ্যান্ডলার কী করে এবং কোথা থেকে আসে সে সম্পর্কেও কোনও তথ্য নেই।
পাভেল Šimerda

xss-lockএআউআর-তে রয়েছে, সুতরাং এটি নিজেই তৈরি করার দরকার নেই no
l0b0

এটি দেবিয়ান পরীক্ষার অধীনে সুন্দরভাবে কাজ করে। পোস্ট করার জন্য ধন্যবাদ। এটি বেশ হতাশাব্যঞ্জক যে
সিস্টেমড

-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()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.