Bagaimana cara mengatur layanan systemd untuk dimulai oleh pengguna non root sebagai daemon pengguna?

20

Saya baru saja menyelesaikan proses instalasi dan pengaturan systemd pada sistem arch-linux saya (2012.09.07). Saya mencopot pemasangan initscripts(dan menghapus file konfigurasi).

Yang ingin saya lakukan adalah membuat layanan yang dapat dimulai dan dihentikan oleh pengguna non-root. Layanan ini untuk memulai sesi layar terpisah menjalankan rtorrent. Namun saya ingin setiap pengguna pada sistem yang telah mengatur layanan ini untuk memulai (diaktifkan) untuk memiliki contoh khusus dimulai untuk mereka secara khusus. Bagaimana cara melakukan ini?

Saya ingat membaca bahwa systemd mendukung contoh layanan pengguna, namun saya tidak dapat menemukan informasi tentang cara mengatur ini, atau apakah itu berkaitan dengan apa yang saya cari.

File layanan yang saya gunakan untuk sistem:

[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

PEMBARUAN # 1 :

Setelah membaca halaman manual di sini dan di sini , saya mengerti bagaimana systemd bekerja sedikit lebih baik. Khususnya bahwa menggunakan opsi User=dan WorkingDirectory=memungkinkan layanan untuk dimulai pada sesi pengguna. Namun masalah masih tetap bahwa pengguna sendiri tidak bisa start, stop, enable, atau disablelayanan. Sebuah Akses ditolak kesalahan diberikan oleh systemctl.

PEMBARUAN # 2 :

Pertama, untuk penyederhanaan dan untuk penggunaan yang lebih baik dari sesi pengguna systemd (masih agak tidak lengkap), saya menggunakan unit sesi pengguna-sofar dan mengikuti saran konfigurasi.

Tampaknya ada bug dalam versi DBus saat ini (1.6.4-1) di mana ia tidak mengatur DBUS_SESSION_BUS_ADDRESSmakna variabel lingkungan menggunakan systemctl --userkesalahan perintah dengan:

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

Variabel akan terlihat seperti ini:

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

di mana USERUID perlu menjadi UID dari pengguna yang diberikan.

Hans
sumber
Saya menyadari bahwa seseorang dapat membuat file layanan terpisah per pengguna, dan cukup mengaktifkannya. Namun saya hanya ingin tahu apakah mungkin cara saya menggambarkannya di atas.
Hans
Cukup adil, saya bisa mengatur sederhana sudountuk pengguna dan meminta mereka, sebagaimana disebutkan dalam komentar saya di atas, mengontrol file layanan mereka sendiri. Namun solusi ini akan memungkinkan pengguna untuk mengontrol sebagian besar layanan lainnya juga ...
Hans
Tidak akan, jika Anda telah membaca sudodokumentasi - sudoers (5) memiliki banyak contoh untuk membatasi argumen perintah.
grawity

Jawaban:

19

systemd biasanya tidak memungkinkan pengguna biasa untuk memulai layanan sistem. Meskipun mendukung memberikan akses melalui polkit, bagian itu masih kurang, dan Anda belum dapat mengizinkan hanya satu layanan tertentu.

Karena rtorrent sebenarnya bukan layanan sistem, dan karena Anda ingin setiap pengguna memiliki instance rtorrent sendiri, bereksperimenlah dengan mode "pengguna" systemd.

Ketika Anda masuk, sistem akan memulai user@<uid>.serviceunit sistem untuk Anda, yang akan meluncurkan instance "--user" terpisah dari systemd. User-systemd baru akan membaca file unit (dimulai dengan default.target) dari ~/.config/systemd/user/, /etc/systemd/user/dan /usr/lib/systemd/user/.

grawity
sumber
1
Terima kasih grawity, pada dasarnya itulah yang saya lewatkan. Namun ternyata juga telah menjadi masalah DBus juga: tampaknya ada bug di dbuse yang tidak mengatur variabel global yang benar DBUS_SESSION_BUS_ADDRESSuntuk pengguna tertentu, jadi systemctl tidak dapat mengakses sesi pengguna, itu kesalahan kami. Setelah saya menemukan masalah kecil ini, semuanya berjalan dengan baik!
Hans