หน่วยผู้ใช้ Systemd ที่ขึ้นอยู่กับหน่วยระบบ (sleep.target)


16

ฉันอ่านหมอและมันก็ยังไม่ชัดเจนสำหรับฉันไม่ว่าจะเป็นไปได้ที่จะสำเร็จ:

บริการที่กำหนดใน~/.config/systemd/user/task.serviceนั้นขึ้นอยู่กับระบบsleep.target( ~/.config/systemd/user/sleep.target.wants/task.service)

ตอนนี้ฉันคาดหวัง task.serviceจะเริ่มเมื่อฉันวิ่ง$ systemctl suspendแต่task.serviceยังไม่เริ่ม

ฉันใช้เดเบียนกับ systemd รุ่น 208 systemd --userกำหนดค่ามากหรือน้อยตามที่อธิบายไว้ใน ArchWiki

ฉันสงสัยว่าสถานการณ์ของฉันอาจจะนำมาใช้กับ systemd ที่ทั้งหมดหรือมี--systemและ--userสมบูรณ์แยกจากการออกแบบเพื่อให้--userหน่วยอาจจะไม่พึ่งพาของ--systemหน่วย

ในกรณีที่เป็นไปได้สิ่งที่อาจเป็นปัญหาในกรณีของฉัน?


คำตอบ:


8

จากsystemd / ผู้ใช้ - Archwiki

systemd --userทำงานเป็นกระบวนการแยกจากsystemd --systemกระบวนการ หน่วยผู้ใช้ไม่สามารถอ้างอิงหรือขึ้นอยู่กับหน่วยระบบ


4
อันนี้ครับ มันแย่มาก
Rolf

5

systemdบริการเซสชันผู้ใช้ทำงานในอินสแตนซ์ที่แยกจากกันอย่างสมบูรณ์systemdและไม่มีวิธีใดที่จะขึ้นอยู่กับบริการของระบบโดยตรง

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

วิธีแก้ปัญหาทั่วไปที่มากขึ้นคือการให้ daemon เชื่อมต่อlogindตัวยับยั้ง (ดูที่systemd-lock-handlerและxss-lock ) จากนั้นเมื่อระบบเข้าสู่โหมดสลีประบบจะเปิดใช้งานเป้าหมายเซสชันผู้ใช้ที่คุณสามารถสั่งซื้อบริการของคุณ ภายใต้


2

การเพิ่มคำตอบจาก @kyrias ต่อไปนี้เป็นวิธีสร้าง sleep.target ระดับผู้ใช้ของคุณเอง:

~ / .local / share / systemd / ผู้ใช้ / sleep.target

[Unit]
Description=User level sleep target
StopWhenUnneeded=yes

~ / .local / bin / watch_sleep

#!/bin/bash

dbus-monitor --system "type='signal',interface='org.freedesktop.login1.Manager',member=PrepareForSleep" | while read x; do
    case "$x" in
        *"boolean false"*) systemctl --user --no-block stop sleep.target;;
        *"boolean true"*) systemctl --user --no-block start sleep.target;;
    esac
done

~ / .local / share / systemd / ผู้ใช้ / watch_sleep.service

[Unit]
Description=watch for sleep signal to start sleep.target

[Service]
ExecStart=%h/.local/bin/watch_sleep
Restart=on-failure

[Install]
WantedBy=default.target

ดูโพสต์บล็อกของฉันhttps://medium.com/@aiguofer/systemd-sleep-target-for-user-level-10eb003b3bfd

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