Como configuro um serviço systemd para ser iniciado por um usuário não root como um daemon de usuário?


20

Acabei de terminar o processo de instalação e configuração do systemd no meu sistema arch-linux (2012.09.07). Eu desinstalei initscripts(e removi os arquivos de configuração).

O que eu quero fazer é criar um serviço que possa ser iniciado e interrompido por um usuário não raiz. O serviço é iniciar uma sessão de tela desanexada executando o rtorrent. No entanto, eu quero que todos os usuários do sistema que configuraram esse serviço iniciem (ativados) tenham uma instância específica iniciada especificamente para eles. Como alguém faria isso?

Lembro-me de ler que o systemd suporta instâncias de serviços do usuário, no entanto, não consegui encontrar nenhuma informação sobre como configurá-lo ou se ele está relacionado ao que estou procurando.

Arquivo de serviço que eu usei para o 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

ATUALIZAÇÃO # 1 :

Depois de ler as páginas de manual aqui e aqui , entendo como o systemd funciona um pouco melhor. Especificamente, o uso das opções User=e WorkingDirectory=permite que o serviço seja iniciado na sessão de um usuário. No entanto, a questão ainda permanece que o usuário em si não pode start, stop, enable, ou disableo serviço. Um erro de acesso negado é dado por systemctl.

ATUALIZAÇÃO # 2 :

Primeiramente, para simplificação e para melhor uso do recurso de sessão do usuário do systemd (ainda um pouco incompleto), usei as unidades de sessão do usuário do sofar e segui seu conselho de configuração.

Parece que há um erro na versão atual do DBus (1.6.4-1) na qual ele não define o DBUS_SESSION_BUS_ADDRESSsignificado da variável de ambiente usando os systemctl --usererros de comando com:

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

A variável deve ficar assim:

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

onde USERUID precisa ser o UID do usuário especificado.


Sei que é possível criar um arquivo de serviço separado por usuário e simplesmente ativá-lo. No entanto, só quero saber se é possível da maneira que a descrevi acima.
Hans

É justo, eu poderia configurar de maneira simples sudoos usuários e tê-los, como mencionado no meu comentário acima, controlar seu próprio arquivo de serviço. Contudo, esta solução permitiria ao usuário controlar a maioria dos outros serviços, bem ...
Hans

Não seria, se você tivesse lido sudoa documentação - sudoers (5) tem muitos exemplos para restringir os argumentos de um comando.
grawity

Respostas:


19

O systemd normalmente não permite que usuários comuns iniciem serviços do sistema. Embora suporte o acesso via polkit, essa parte ainda está um pouco ausente e você ainda não pode permitir apenas um serviço específico.

Como o rtorrent não é realmente um serviço do sistema, e como você deseja que cada usuário tenha sua própria instância do rtorrent, experimente o modo "usuário" do systemd.

Quando você user@<uid>.serviceefetua login, o sistema inicia uma unidade de sistema para você, que inicia uma instância "--user" separada do systemd. O novo user-systemd lerá os arquivos da unidade (começando com default.target) de ~/.config/systemd/user/, /etc/systemd/user/e /usr/lib/systemd/user/.


11
Graças grawity, era basicamente o que eu estava perdendo. No entanto, também parece haver um problema com o DBus: parece haver um bug no dbuse que não define a variável global correta DBUS_SESSION_BUS_ADDRESSpara um determinado usuário, portanto o systemctl não pode acessar a sessão do usuário, mas com erro. Depois que eu descobri esse pequeno problema, tudo o resto funciona lindamente!
Hans
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.