Come posso configurare un servizio systemd che deve essere avviato da un utente non root come demone utente?


20

Ho appena finito il processo di installazione e configurazione di systemd sul mio sistema arch-linux (2012.09.07). Ho disinstallato initscripts(e rimosso i file di configurazione).

Quello che voglio fare è creare un servizio che può essere avviato e arrestato da un utente non root. Il servizio consiste nell'avvio di una sessione di schermo distaccato che esegue rtorrent. Tuttavia, desidero che tutti gli utenti del sistema che hanno impostato questo servizio per l'avvio (abilitato) abbiano una specifica istanza avviata appositamente per loro. Come si potrebbe fare per fare questo?

Ricordo di aver letto che systemd supporta istanze di servizi degli utenti, tuttavia non sono stato in grado di trovare alcuna informazione su come configurarlo o se si riferisce a ciò che sto cercando.

File di servizio che ho usato per il sistema:

[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

AGGIORNAMENTO N. 1 :

Dopo aver letto le pagine man qui e qui , capisco come systemd funzioni un po 'meglio. In particolare, l'utilizzo delle opzioni User=e WorkingDirectory=consente l'avvio del servizio nella sessione di un utente. Tuttavia, la questione rimane ancora che l'utente se stessi non può start, stop, enableo disableil servizio. Un errore di accesso negato è dato da systemctl.

AGGIORNAMENTO # 2 :

Prima di tutto, per semplificare e utilizzare al meglio la funzione di sessione utente di Systemd (ancora un po 'incompleta), ho usato le unità di sessione utente di Sofar e ho seguito i suoi consigli di configurazione.

Sembra che ci sia un bug nella versione corrente di DBus (1.6.4-1) in cui non imposta il DBUS_SESSION_BUS_ADDRESSsignificato della variabile d'ambiente usando gli systemctl --usererrori del comando con:

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

La variabile dovrebbe apparire così:

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

dove USERUID deve essere l'UID dell'utente specificato.


Mi rendo conto che si potrebbe creare un file di servizio separato per utente e semplicemente abilitarlo. Tuttavia, voglio solo sapere se potrebbe essere possibile come l'ho descritto sopra.
Hans,

Abbastanza giusto, potrei configurare semplicemente sudogli utenti e farli controllare, come menzionato nel mio commento sopra, il proprio file di servizio. Tuttavia questa soluzione consentirebbe all'utente di controllare anche la maggior parte degli altri servizi ...
Hans,

Non sarebbe, se avessi letto sudola documentazione - sudoers (5) ha molti esempi sulla limitazione degli argomenti di un comando.
Grawity,

Risposte:


19

systemd normalmente non consente agli utenti ordinari di avviare i servizi di sistema. Mentre supporta l'accesso tramite polkit, quella parte è ancora un po 'carente e non è ancora possibile consentire solo un servizio specifico.

Poiché rtorrent non è in realtà un servizio di sistema e poiché si desidera che ogni utente abbia la propria istanza di rtorrent, provare la modalità "utente" di systemd.

Quando user@<uid>.serviceeffettui l' accesso, il sistema avvierà un'unità di sistema per te, che avvierà un'istanza separata "--user" di systemd. Il nuovo utente-systemd leggerà i file di unità (a partire da default.target) da ~/.config/systemd/user/, /etc/systemd/user/e /usr/lib/systemd/user/.


1
Grazie alla gravità, questo era fondamentalmente ciò che mi mancava. Tuttavia risulta anche essere stato un problema di DBus: sembra che ci sia un bug in dbuse che non imposta la variabile globale corretta DBUS_SESSION_BUS_ADDRESSper un determinato utente, quindi systemctl non può accedere alla sessione dell'utente, ma sbaglia il nostro. Una volta capito questo piccolo problema, tutto il resto funziona magnificamente!
Hans,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.