No systemd (e em outros sistemas init modernos), a inicialização do serviço é estritamente separada em duas etapas:
- Ferramentas do usuário (por exemplo, systemctl) solicitam remotamente ao init (pid 1) para iniciar um serviço específico.
- O Init lê a configuração do serviço, configura o ambiente (incluindo alternar para a conta de usuário desejada) e executa o executável.
Devido a essa indireção, os serviços sempre terão o mesmo ambiente, independentemente de quem e como eles foram iniciados. (Anteriormente, o ambiente do usuário como contexto de localidade, caminho ou SELinux vazando em serviços costumava ser um problema comum.)
(Para scripts init.d, o arquivo lsb-functions da distribuição contém os redirecionamentos mágicos para 'systemctl start', então eles também recebem a mesma indirecção.)
Isso também significa que você não pode iniciar um serviço "como o mesmo usuário" - você deve configurar um nome de usuário específico no arquivo systemd .service relevante (e se não houver nenhum, você deve escrever) um).
A chamada de 'start service' é normalmente privilegiada, mas você pode escrever uma regra de polkit que permita por usuário ou por serviço (se a versão do systemd for recente o suficiente):
/* /etc/polkit-1/rules.d/allow-whatever.rules */
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units") {
var verb = action.lookup("verb");
var unit = action.lookup("unit");
if (subject.user == "manager"
&& unit == "app.service"
&& (verb == "start" || verb == "stop" || verb == "restart"))
{
return polkit.Result.YES;
}
}
});
Como alternativa, pode ser possível desativar a indireção no script init.d, mas você também perderá o rastreamento do serviço do systemd completamente - seu daemon parecerá um processo normal do usuário.