サービスがユーザー サービスなのかシステム サービスなのかをどうやって知ることができますか?

サービスがユーザー サービスなのかシステム サービスなのかをどうやって知ることができますか?

サービスを照会して、たとえば、それが から開始されたのかlib/systemd/system、 から開始されたのかを知ることは可能ですか/.config/systemd/user/?

私は現在サービスを作成中ですsystemd。現在はルートとして実行されるようにしていますlib/systemd/systemが、各ユーザーに対しても機能するようにしたいと考えています。

私のサービスには、ルートアクセス権があるかどうかを知る必要があるチェックがいくつかあります。そのため、サービスに関するそのような情報を取得できるかどうかを調べようとしています。

systemd私は Ubuntu を使用していますが、このソリューションが他のディストリビューションにも適用できるかどうかを知りたいです。

答え1

メイン サービスが root として実行されていると仮定すると、次のような非常に簡単なテストを実行できます。

if(getuid() == 0)
{
    ...act as root...
}
else
{
    ...act as user...
}

機能にも興味があるかもしれませんseteuid()。この機能により、ユーザーを切り替えることができますが、これは実際に root になってから他のユーザーに切り替えることができる場合にのみ可能です。実行ファイルにフラグがある場合は root になることができますがs、サービスの場合は実際には推奨されません (systemd ではデフォルトでこのような変更が行われないようにします)。

最後に、systemd では、root 以外のユーザーとしてマルチユーザー サービスを実行できます。つまり、その識別子は 0 ではありません。このような機能を使用する場合は、まず ID を決定する必要があります。

struct passwd * p = getpwnam("my-global-service-user-name");
if(getuid() == p->pw_uid)
...

ユーザー名は となり"root"、関数は0 に設定され/etc/passwdた root ユーザーのエントリを返します。uid

関連情報