Làm cách nào để thiết lập dịch vụ systemd được bắt đầu bởi người dùng không phải root như daemon người dùng?


20

Tôi vừa hoàn thành quá trình cài đặt và thiết lập systemd trên hệ thống arch-linux của tôi (2012/09/07). Tôi gỡ cài đặt initscripts(và loại bỏ các tập tin cấu hình).

Những gì tôi muốn làm là tạo ra một dịch vụ có thể được bắt đầu và dừng bởi một người dùng không phải root. Dịch vụ này là để bắt đầu một phiên màn hình tách rời chạy rtorrent. Tuy nhiên, tôi muốn mọi người dùng trên hệ thống đã đặt dịch vụ này bắt đầu (được bật) để có một phiên bản cụ thể được bắt đầu cho họ một cách cụ thể. Làm thế nào một người sẽ đi về làm điều này?

Tôi nhớ rằng đọc systemd hỗ trợ các phiên bản dịch vụ của người dùng, tuy nhiên tôi không thể tìm thấy bất kỳ thông tin nào về cách thiết lập dịch vụ này, hoặc liệu nó có liên quan đến những gì tôi đang tìm kiếm hay không.

Tệp dịch vụ mà tôi đã sử dụng cho hệ thống:

[Unit]
Description=rTorrent

[Service]
Type=forking
ExecStart=/usr/bin/screen -d -m -S rtorrent /usr/bin/rtorrent
ExecStop=/usr/bin/killall -w -s 2 /usr/bin/rtorrent

CẬP NHẬT # 1 :

Sau khi đọc qua các trang man ở đâyđây , tôi hiểu cách systemd hoạt động tốt hơn một chút. Cụ thể là việc sử dụng User=WorkingDirectory=các tùy chọn cho phép dịch vụ được bắt đầu trong phiên của người dùng. Tuy nhiên vấn đề này vẫn còn mà người dùng tự không thể start, stop, enable, hoặc disabledịch vụ. Một quyền truy cập bị từ chối lỗi được đưa ra bởi systemctl.

CẬP NHẬT # 2 :

Trước hết, để đơn giản hóa và để sử dụng tốt hơn tính năng phiên người dùng của systemd (vẫn chưa hoàn chỉnh), tôi đã sử dụng các đơn vị phiên người dùng của sofar và làm theo lời khuyên cấu hình của anh ấy.

Có vẻ như có một lỗi trong phiên bản hiện tại của DBus (1.6.4-1) trong đó nó không đặt DBUS_SESSION_BUS_ADDRESSnghĩa của biến môi trường bằng cách sử dụng các systemctl --userlỗi lệnh với:

Failed to get D-Bus connection: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

Biến sẽ trông như thế này:

DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/USERUID/dbus/user_bus_socket"

trong đó USERUID cần là UID của người dùng cụ thể.


Tôi nhận ra rằng người ta có thể tạo một tệp dịch vụ riêng cho mỗi người dùng và chỉ cần kích hoạt nó. Tuy nhiên tôi chỉ muốn biết liệu nó có thể như cách tôi đã mô tả ở trên không.
Hans

Đủ công bằng, tôi có thể thiết lập đơn giản sudocho người dùng và có họ, như đã đề cập trong nhận xét của tôi ở trên, kiểm soát tệp dịch vụ của riêng họ. Tuy nhiên, giải pháp này cũng cho phép người dùng kiểm soát hầu hết các dịch vụ khác ...
Hans

Sẽ không, nếu bạn đã đọc sudotài liệu của mình - sudoers (5) có nhiều ví dụ về việc hạn chế các đối số của lệnh.
grawity

Câu trả lời:


19

systemd thường không cho phép người dùng thông thường bắt đầu dịch vụ hệ thống. Mặc dù nó hỗ trợ cấp quyền truy cập thông qua polkit, nhưng phần đó vẫn còn hơi thiếu và bạn chưa thể chỉ cho phép một dịch vụ cụ thể.

Vì rtorrent thực sự không phải là một dịch vụ hệ thống và vì bạn muốn mọi người dùng có phiên bản rtorrent của riêng họ, hãy thử nghiệm chế độ "người dùng" của systemd.

Khi bạn đăng nhập, hệ thống sẽ khởi động một user@<uid>.serviceđơn vị hệ thống cho bạn, nó sẽ khởi chạy một thể hiện "--user" riêng của systemd. Người dùng-systemd mới sẽ đọc các file đơn vị (bắt đầu với default.target) từ ~/.config/systemd/user/, /etc/systemd/user//usr/lib/systemd/user/.


1
Cảm ơn sự tham lam, đó là những gì tôi đã bỏ lỡ. Tuy nhiên, nó cũng là một vấn đề của DBus: dường như có một lỗi trong dbuse không đặt đúng biến toàn cục DBUS_SESSION_BUS_ADDRESScho một người dùng nhất định, vì vậy systemctl không thể truy cập phiên người dùng, nó lỗi. Khi tôi nhận ra vấn đề nhỏ này, mọi thứ khác đều hoạt động tốt!
Hans
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.