Unit pengguna systemd yang tergantung pada unit sistem (sleep.target)

16

Saya sedang membaca dokumen dan masih belum jelas bagi saya, apakah hal-hal berikut ini dapat diselesaikan:

layanan yang ditentukan ~/.config/systemd/user/task.servicetergantung pada sistem sleep.target( ~/.config/systemd/user/sleep.target.wants/task.service).

Sekarang saya berharap task.serviceuntuk memulai ketika saya menjalankan $ systemctl suspend, namun task.servicetidak dimulai.

Saya menjalankan debian, dengan systemd versi 208, systemd --userdikonfigurasi lebih atau kurang seperti yang dijelaskan pada ArchWiki .

Saya bertanya-tanya apakah skenario saya dapat diimplementasikan dengan systemd sama sekali, atau apakah --systemdan --usersepenuhnya terisolasi oleh desain sehingga --userunit mungkin tidak menjadi ketergantungan suatu --systemunit.

Jika mungkin, apa yang menjadi masalah dalam kasus saya?

Alexander Kitaev
sumber

Jawaban:

8

Dari systemd / Pengguna - Archwiki

systemd --userberjalan sebagai proses terpisah dari systemd --systemproses. Unit pengguna tidak dapat merujuk atau bergantung pada unit sistem.

sshow
sumber
4
Ini menyebalkan. Sayang sekali.
Rolf
5

systemdlayanan sesi pengguna dijalankan dalam instance yang sepenuhnya terpisah systemd, dan tidak memiliki cara untuk bergantung pada layanan sistem secara langsung.

Ada cara lain untuk mencapai apa yang Anda inginkan. Yang terbersih mungkin akan membuat apa pun yang Anda ingin jalankan ketika sistem akan tidur menghubungkan ke logindpenghambat dan kemudian menjalankannya sebagai daemon latar belakang.

Solusi yang lebih umum adalah dengan memasang daemon hooks ke dalam logindinhibitor, (lihat systemd-lock-handler dan xss-lock ,) dan kemudian ketika sistem akan tidur itu akan mengaktifkan target sesi pengguna yang dapat Anda pesan layanan Anda. dibawah.

Kyrias
sumber
2

Menambahkan ke respons dari @kyrias, berikut adalah cara untuk membuat sleep.target tingkat pengguna Anda sendiri:

~ / .local / share / systemd / user / 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 / user / 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

Lihat posting blog saya https://medium.com/@aiguofer/systemd-sleep-target-for-user-level-10eb003b3bfd

aiguofer
sumber