Eu tenho um aplicativo da web que lida com a entrada do usuário e, como parte disso, executa alguns comandos systemd-run --user --scope ...
para limitar o uso de memória e CPU.
O aplicativo funciona bem quando executado normalmente, mas quando executado como um serviço systemd, recebo:
Failed to connect to bus: No medium found
O que preciso fazer na unidade para que o serviço habilite isso?
--user
entra em contato com a instância por usuário do systemd para esse UID, que só é iniciado quando há uma sessão de login real para esse UID. Quando não houver nenhum, é necessáriologinctl enable-linger <user>
que o gerenciador de serviços esteja sempre em execução para esse usuário.O webapp precisa ter o correto
XDG_RUNTIME_DIR=
em seu ambiente para que possa encontrar a tomada do barramento; está sempre no mesmo local/run/user/<uid>
. (O diretório será criado pelo systemd quando o linger estiver ativado.)Você provavelmente precisará usar
--service
em vez de--scope
. Este último não será capaz de migrar seu processo entre cgroups devido à falta de permissões de "ancestral comum", então é necessário que o próprio systemd inicie o processo.(Em uma sessão de usuário, seu próprio cgroup por UID
user-1234.slice
é o ancestral comum do seu terminal interativo cgroup e do novo cgroup de escopo do systemd, mas ao tentar fazer isso a partir de um serviço, o único ancestral comum seria aquele-.slice
que você não tem permissões para.)Configurar o webapp .service com a
PAMName=
para que o webapp realmente seja executado em uma sessão de login evitaria alguns dos problemas acima, mas também tenho a sensação de que isso causará novos problemas, por isso não estou sugerindo isso como a primeira opção.