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 disable
o 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_ADDRESS
significado da variável de ambiente usando os systemctl --user
erros 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.
fonte
sudo
os 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 ...sudo
a documentação - sudoers (5) tem muitos exemplos para restringir os argumentos de um comando.Respostas:
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>.service
efetua 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 comdefault.target
) de~/.config/systemd/user/
,/etc/systemd/user/
e/usr/lib/systemd/user/
.fonte
DBUS_SESSION_BUS_ADDRESS
para 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!