システムデバイスに依存するシステムユーザー単位(sleep.target)

システムデバイスに依存するシステムユーザー単位(sleep.target)

文書を読んでいますが、次のことができるかどうかはまだわかりません。

定義されたサービスは~/.config/systemd/user/task.serviceシステムによって異なりますsleep.target~/.config/systemd/user/sleep.target.wants/task.service)。

task.service今、実行時に始め$ systemctl suspendたいのですが、そうではtask.serviceありません。

私はDebianを実行しており、システムバージョンは208で、設定systemd --userはおおよそ次のようになります。建築ウィキペディア

私のシナリオをsystemdとして実装できるのか、それともユニットがユニットの依存関係にならないように設計上完全に--system分離できるのか疑問に思います。--user--user--system

可能であれば、私の場合、何が問題になる可能性がありますか?

答え1

~からシステム/ユーザー - Archwiki

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

一つあるシステムGitHubリポジトリの機能リクエストこの問題を追跡してください。

答え2

サービスとユーザーインスタンス間のすべてのスリープ/一時停止ターゲットの「プロキシ」を作成することもできます。

このファイルを次の場所に作成します。/etc/systemd/system/[email protected]

[Unit]
Description=Call user's suspend target after system suspend
After=suspend.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl --user --machine=%i@ start --wait suspend.target

[Install]
WantedBy=suspend.target

を実行して有効にしますsudo systemctl daemon-reload && sudo systemctl enable suspend@youruser

今すぐsuspend.targetユーザーを作成します~/.config/systemd/user/suspend.target

[Unit]
Description=User level suspend target
StopWhenUnneeded=yes
Wants=my-etc-service.service

次に、サービスをWantsリストに追加し、実行中であることを確認します。systemctl --user daemon-reload

答え3

systemdユーザーセッションサービスは完全に別々のインスタンスで実行され、systemdいかなる方法でもシステムサービスに直接依存しません。

しかし、あなたが望むことを達成する別の方法があります。最もきちんとした方法は、おそらくlogindシステムがスリープモードに入ったときにインヒビターに実行したいすべてを接続し、それをバックグラウンドデーモンとして実行することです。

logindより一般的な解決策は、抑制剤にデーモンフックを置くことです(参照:システムロックハンドラそしてxssロック)次に、システムがスリープモードに移行すると、サービスを注文できるユ​​ーザーセッションターゲットをアクティブにします。

答え4

ユーザー空間で実装sleep.target(および補完)するには、次のようにしますawake.target

次のサービステンプレートを作成します。/etc/systemd/system/[email protected]

[Unit]
Description=%I sleep hook
PartOf=sleep.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/systemctl --user --machine=%i@ start sleep.target
ExecStop=/usr/bin/systemctl --user --machine=%i@ start awake.target

[Install]
WantedBy=sleep.target

ユーザー用のインスタンスを作成します(起動しないでください):

sudo systemctl enable sleep@$(whoami)

これでユーザーには次のようになりますsleep.target

[Unit]
Description=User-level Sleep Target
Conflicts=awake.target

そしてawake.target

[Unit]
Description=User-level Awake Target
Conflicts=sleep.target

[Install]
WantedBy=default.target

systemctl --user enable awake.targetログイン時に起動可能

目標の1つに達すると、他の目標は停止します。Conflictsディレクティブは相互に排他的なターゲットになります。

私のユースケースでは、実際には次のものを使用していくつかのユーザーサービスを持つことができるので、awake.targetより便利です。sleep.targetPartOf開始と停止の指示です。

私が考えるとターゲティングで利益を得ることができる唯一のユースケースは、システムがスリープモードに入る前に、sleep誰かが最後の瞬間にクリーンアップを実行しようとしている場合です。systemd-inhibitこれはまた、実際の睡眠目標を仕事の終わりまで延期することを意味します。

関連情報