Tentando executar um serviço systemd com systemctl --user start foo.service
which contém ExecStart=touch /bar/baz
where /bar
has permissions drwxrwxr-x 1 root storage
. O usuário que está executando o comando pertence ao grupo storage
e pode executar o touch
comando do shell sem problemas, criando o arquivo. O serviço, no entanto, falha com um erro de permissão.
Pensei que as permissões do serviço corresponderiam ao usuário que o executa - e, de fato, fazer com que o serviço use a ${USER}
variável de ambiente em seu comando produz meu usuário, e o serviço aparece em minhas listas ps
ou .pstree ${USER}
foo.service
não contém ProtectSystem
ou qualquer entrada diferente de: Description
, EnvironmentFile
, Environment
, ExecStart
, KillSignal
, Restart
, RestartSec
. As entradas de ambiente são para carregar configuração não relacionada a permissão.
O serviço não usa realmente o usuário chamador para permissões? E se não, qual seria a melhor abordagem para resolver o problema? /bar
está em uma unidade montada, então posso apenas dmask 0000
no meu fstab, mas prefiro evitar essa abordagem.
Sim, mas indiretamente, porque o systemctl não gera processos por conta própria – ele apenas contata o
systemd --user
gerenciador de serviços, então a associação de grupo dos seus serviços de usuário sempre será herdada do processo do gerenciador de serviços, não do chamador que executou o systemctl.O
--user
gerenciador de serviços de fato roda sob sua própria conta de usuário, mas é realmente iniciado como um serviço de segundo plano (user@<uid>.service
) e sua associação de grupo é inicializada separadamente daquela da sua sessão de logon. Há apenas uma instância por UID compartilhada entre todas as sessões, então ele manterá a associação de grupo desde o momento em que você fez login pela primeira vez no sistema, mesmo se você se adicionou a outros grupos mais tarde.Se você sair de todas as sessões (e não tiver o sinalizador 'linger' em loginctl), o gerenciador de serviços sai após um atraso ocioso de ~10 segundos. Então, qualquer alteração na associação ao grupo só será propagada se você a) sair e esperar 10s para o gerenciador de serviços sair, ou b) reiniciar manualmente sua instância [email protected] (correndo o risco de matar toda a sua sessão GUI com isso).