Como é possível saber se um serviço é um serviço de usuário ou um serviço de sistema?

Como é possível saber se um serviço é um serviço de usuário ou um serviço de sistema?

É possível consultar um serviço e saber, por exemplo, se ele foi iniciado a partir de lib/systemd/systemou de /.config/systemd/user/?

Estou escrevendo um systemdserviço e atualmente o coloquei para que lib/systemd/systemele 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 systemdtambé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 ssinalizador, 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/passwdentrada para o usuário root que foi uiddefinido como 0.

informação relacionada