システムユニットに依存するSystemdユーザーユニット(sleep.target)


16

私はドキュメントを読んでいましたが、次のことが達成できるかどうかはまだわかりません:

~/.config/systemd/user/task.serviceその中で定義されているサービスはシステムに依存しますsleep.target~/.config/systemd/user/sleep.target.wants/task.service)。

task.service、私は実行時に開始する予定ですが$ systemctl suspendtask.service開始されていません。

私は、Debianを実行しており、systemdバージョン208でsystemd --userArchWikiで説明されているように設定されています

私は私のシナリオがすべてでsystemdにして実施、またはあることができるかどうかを疑問に思う--system--userなるように完全に設計により単離さ--userユニットはの依存性ではないかもしれない--systemユニット。

可能であれば、私の場合の問題は何ですか?


回答:


8

systemd /ユーザーから-Archwiki

systemd --userプロセスとは別のプロセスとして実行されsystemd --systemます。ユーザーユニットは、システムユニットを参照したり、システムユニットに依存したりすることはできません。


4
これはひどい。残念です。
ロルフ

5

systemd ユーザーセッションサービスは、完全に独立したインスタンスで実行されます systemdシステムサービスに直接依存する方法はありません。

あなたが望むものを達成するための他の方法があります。最もクリーンなのは、おそらくシステムがスリープするときに実行したいものを何でも作成logindし、バックグラウンドデーモンとして実行することです。

より一般的な解決策は、デーモンをlogindインヒビタにフックさせることです(systemd-lock-handlerおよびxss-lockを参照)。そして、システムがスリープ状態になると、サービスを注文できるユ​​ーザーセッションターゲットをアクティブにします。下。


2

@kyriasからの応答に追加して、独自のユーザーレベルのsleep.targetを作成する方法を次に示します。

〜/ .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

私のブログ投稿https://medium.com/@aiguofer/systemd-sleep-target-for-user-level-10eb003b3bfdをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.