Đơn vị người dùng Systemd phụ thuộc vào đơn vị hệ thống (ngủ.target)


16

Tôi đã đọc tài liệu và vẫn chưa rõ ràng cho tôi, liệu những điều sau đây có thể thực hiện được không:

dịch vụ được xác định trong ~/.config/systemd/user/task.serviceđó phụ thuộc vào hệ thống sleep.target( ~/.config/systemd/user/sleep.target.wants/task.service).

Bây giờ tôi dự kiến task.servicesẽ bắt đầu khi tôi chạy $ systemctl suspend, tuy nhiên task.servicekhông được bắt đầu.

Tôi đang chạy debian, với phiên bản systemd 208, được systemd --usercấu hình ít nhiều như được mô tả trên ArchWiki .

Tôi tự hỏi liệu kịch bản của tôi có thể được thực hiện với systemd hay không --system, và --userhoàn toàn bị cô lập bởi thiết kế để --userđơn vị đó có thể không phải là một phụ thuộc của một --systemđơn vị.

Trong trường hợp có thể, vấn đề trong trường hợp của tôi là gì?


Câu trả lời:


8

Từ systemd / Người dùng - Archwiki

systemd --userchạy như một quy trình riêng biệt từ systemd --systemquy trình. Đơn vị người dùng không thể tham chiếu hoặc phụ thuộc vào đơn vị hệ thống.


4
Điều này thật tệ Điều đó thật tệ.
Rolf

5

systemddịch vụ phiên người dùng chạy trong một trường hợp hoàn toàn riêng biệt systemdvà không có cách nào để phụ thuộc trực tiếp vào dịch vụ hệ thống.

Có nhiều cách khác để thực hiện những gì bạn muốn mặc dù. Sạch nhất có lẽ là làm cho bất cứ thứ gì bạn muốn chạy khi hệ thống chuyển sang chế độ ngủ thành logindcác chất ức chế và sau đó chạy nó như một trình nền.

Một giải pháp tổng quát hơn là có một móc daemon vào các logindchất ức chế, (xem systemd-lock-handlerxss-lock ,) và sau đó khi hệ thống chuyển sang chế độ ngủ, nó sẽ kích hoạt mục tiêu phiên người dùng mà bạn có thể đặt hàng dịch vụ của mình Dưới.


2

Thêm vào phản hồi từ @kyrias, đây là một cách để tạo cấp độ người dùng của riêng bạn ngủ.target:

~ / .local / share / systemd / user / ngủ.target

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

~ / .local / bin / watch_s ngủ

#!/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_s ngủ.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

Xem bài đăng trên blog của tôi https://medium.com/@aiguofer/systemd-s ngủ-target- for-user-level-10eb003b3bfd

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.