文書を読んでいますが、次のことができるかどうかはまだわかりません。
定義されたサービスは~/.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
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.target
PartOf
開始と停止の指示です。
私が考えるとターゲティングで利益を得ることができる唯一のユースケースは、システムがスリープモードに入る前に、sleep
誰かが最後の瞬間にクリーンアップを実行しようとしている場合です。systemd-inhibit
これはまた、実際の睡眠目標を仕事の終わりまで延期することを意味します。