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 concluir o processo de instalação e configuração do systemd no meu sistema arch-linux (2012.09.07). Eu desinstalei o 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-root. O serviço é iniciar uma sessão de tela desanexada executando o rtorrent. No entanto, quero que todos os usuários do sistema que definiram este serviço para iniciar (habilitado) 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 usuários de serviços, 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 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

UPDATE # 1 :

Depois de ler as páginas man aqui e aqui , eu 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, o problema ainda é que o próprio usuário não pode start , stop , enable ou disable o serviço. Um erro Acesso negado é dado por systemctl .

UPDATE # 2 :

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

Parece que há um bug na versão atual do DBus (1.6.4-1) no qual ele não configura a variável de ambiente DBUS_SESSION_BUS_ADDRESS , o que significa usar os erros do comando systemctl --user 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.

    
por Hans 18.09.2012 / 01:33

1 resposta

18

O systemd normalmente não permite que usuários comuns iniciem serviços do sistema. Embora suporte o acesso ao polkit, essa parte ainda está faltando, 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 porque você quer que cada usuário tenha sua própria instância do rtorrent, experimente o modo "user" do systemd.

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

    
por 20.09.2012 / 14:22