É possível consultar um serviço e saber, por exemplo, se ele foi iniciado a partir de lib/systemd/system
ou de /.config/systemd/user/
?
Estou escrevendo um systemd
serviço e atualmente o coloquei para que lib/systemd/system
ele seja executado como root, mas também quero fazê-lo funcionar para cada usuário.
Tenho algumas verificações no meu serviço, que preciso saber se tem acesso root ou não. É por isso que estou tentando descobrir se consigo obter essas informações sobre um serviço.
Estou usando Ubuntu, mas gostaria de saber se a solução é aplicável a outras distros que uso systemd
também.
Responder1
Supondo que seu serviço principal seja executado como root, você pode fazer um teste muito simples como este:
if(getuid() == 0)
{
...act as root...
}
else
{
...act as user...
}
Você também pode estar interessado na seteuid()
função. Isso permite que você alterne entre usuários, o que só é realmente possível se você puder se tornar root e depois mudar para qualquer outro usuário. Você pode se tornar root se o executável tiver o s
sinalizador, o que realmente não é recomendado para um serviço (e por padrão o systemd impede que tais alterações aconteçam).
Finalmente, o systemd permite executar um serviço multiusuário como um usuário diferente de root. Isso significa que seu identificador não seria 0. Se você estiver usando esse recurso, precisará determinar primeiro o ID.
struct passwd * p = getpwnam("my-global-service-user-name");
if(getuid() == p->pw_uid)
...
O nome de usuário pode ser "root"
e a função retornará a /etc/passwd
entrada para o usuário root que foi uid
definido como 0.