systemctl --user
parece estar funcionando bem para o usuário de desktop:
dev@dev-VirtualBox:~$ systemctl --user > /dev/null
dev@dev-VirtualBox:~$ echo $?
0
Mas ao executar o mesmo comando no usuário www-data, recebo uma resposta inesperada
dev@dev-VirtualBox:~$ sudo su www-data -s /bin/bash
www-data@dev-VirtualBox:~$ systemctl --user > /dev/null
Failed to connect to bus: No such file or directory
www-data@dev-VirtualBox:~$ echo $?
1
Como habilitar systemctl --user
aqui?
Executando o Ubuntu 16.04
A instância por usuário do systemd é iniciada por um gancho no processo de login, um
pam_systemd
PAM, para login de terminal virtual/real comum e login remoto via SSH e outros.Você não está fazendo login. Você está aumentando os privilégios de sua sessão de login existente com
sudo su www-data
. (A propósito, isso é redundante.sudo -u www-data
Irá direto parawww-data
sem seus comandos em execução como superusuário.) Você não invocou o gancho.Portanto
www-data
, a instância por usuário do systemd não foi iniciada esystemctl --user
não encontra nada para conversar.Você pode iniciá-lo manualmente:
(Se você fez isso na ordem errada, então pare o serviço e execute-os na ordem correta. Fazê-los na ordem errada acaba em um estado em que o diretório de tempo de execução está vazio e não possui o D-Bus e outros arquivos de soquete , mas o serviço está em execução e nunca se comunicará com os clientes.)
O único problema é que sua
DBUS_SESSION_BUS_ADDRESS
variável precisa ser alterada para que os programas clientes do Desktop Bussystemctl
conversem com o corretor do Desktop Bus da outra conta quando você os estiver executando com os privilégios dessa outra conta:Esta é a maneira simples. A maneira mais complexa é ajustar a configuração do PAM para que
sudo
chame opam_systemd
gancho. No entanto, isso tem efeitos colaterais, principalmente com relação àXDG_RUNTIME_DIR
variável de ambiente, que você provavelmente não deseja. Apenas tente esta alternativa se tiver certeza de que está bem com os efeitos da introduçãopam_systemd
emsudo
.Leitura adicional
pam_systemd
. páginas de manual do systemd . Freedesktop.org.Então, finalmente consegui descobrir a peça que faltava no quebra-cabeça. Graças a algumas dicas excelentes de @JdeBP, consegui determinar:
Definir XDG_RUNTIME_DIR para exportar "/run/user/$UID" resolveu meu problema
Etapas que segui para obter o comportamento pretendido:
Todas essas são soluções alternativas bastante feias.
Como já foi dito, o problema é:
Como tal, "basta" fazer o login…
Se você estiver em um servidor, precisará usar o terminal. Eu tive que fazer a mesma pergunta , mas finalmente consegui descobrir. A solução é tão fácil quanto executar este comando para alternar para o usuário (respectivamente, execute um shell adequado com esse usuário):
Observe que
sudo loginctl enable-linger www-data
ainda é útil se você pretende iniciar serviços ou algo assim, para que sejam executados na inicialização. Caso contrário, eles só seriam executados no "login" desse usuário.Conforme observado em um comentário aqui , você pode estar perdendo os pacotes relevantes do Ubuntu que permitem a execução
systemctl
como usuário. Acabou de acontecer comigo. Consertar:apt install libpam-systemd
Faça login novamente via SSH como o usuário que deve ser capaz de executar
systemctl --user
. Portanto, não como root.Agora,
echo $XDG_RUNTIME_DIR
deve funcionar sem mais etapas, mostrando algo assim:Ubuntu 18.04 LTS aqui.