systemdはどのユーザーでサービスを開始しますか?

systemdはどのユーザーでサービスを開始しますか?

サービスを開始する方法、特にどのユーザーがサービスを開始するのかを理解したいと思い、systemdLinux PC上で実行されているJenkinsを例として使用したいと思います。

私はこれがLinuxのすべてのプロセスの母親であるinitことを知っていますpid 1。私の場合はそれがpid 1属していますsystemd。以下を実行するとわかりますtop

$ top
Tasks: 646 total,   1 running, 645 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  0.6 sy,  0.0 ni, 97.0 id,  1.3 wa,  0.0 hi,  0.1 si,  0.0 st
MiB Mem : 257826.8 total, 198695.4 free,  28529.6 used,  30601.7 buff/cache
MiB Swap: 262012.0 total, 262012.0 free,      0.0 used. 227579.3 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    1 root      20   0  171284  11196   7904 S   0.3   0.0  31:49.54 systemd

私はsystemdそれがrootとして実行されているので、rootそれが実行しているすべてのサービスがrootとして実行されると素直に考えました。しかし、Jenkinsが私のPCで実行されて
いるようです。 Jenkinsがどのユーザーとして実行されているかを確認しようとしていますが、標準出力にユーザー情報は表示されません。admin
systemctl

user@linux_box:~$ systemctl status jenkins
● jenkins.service - LSB: Start Jenkins at boot time
   Loaded: loaded (/etc/init.d/jenkins; generated)
   Active: active (exited) since Fri 2023-05-05 11:50:06 PDT; 3 days ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 0 (limit: 4915)
   Memory: 0B
   CGroup: /system.slice/jenkins.service

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
user@linux_box:~$

...だから私は次のことを試みますps aux

user@linux_box:~$ ps aux | grep jenkins
admin  2042  0.0  0.0  14164   196 ?        S    May05   0:00 /usr/bin/daemon --name=admin --inherit --env=JENKINS_HOME=/home/admin/jenkins --output=/var/log/jenkins/jenkins.log --pidfile=/var/run/admin/admin.pid -- /usr/bin/java -Djava.awt.headless=true -jar /home/admin/jenkins/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080
admin  2043  1.7  5.3 48146100 14118144 ?   Sl   May05  83:41 /usr/bin/java -Djava.awt.headless=true -jar /home/admin/jenkins/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080
admin 29932  0.0  0.0   6204   892 pts/1    S+   20:37   0:00 grep jenkins

...一番左の列にJenkinsが実行中だと示されているようですがadmin、そうですか?

systemd誰かがユーザー間の関係を説明できますか?それサービスを実行しているユーザーと比較して実行していますか?答えがこのLinux PCでJenkinsの特定の状況に関連付けられている場合は良いでしょう。

ベストアンサー1

systemdがシステムサービスの実行に使用するデフォルトユーザーは実際にはデフォルトユーザーですが、オプションを使用してカスタマイズできますrootUser~からman 5 systemd.exec:

User=Group=

プロセスが実行されるUNIXユーザーまたはグループをそれぞれ設定します。単一のユーザー名、グループ名、または数値IDを引数として使用します。システムサービス(システムサービス管理者が実行するサービス、つまりPID 1で管理されているサービス)とrootユーザーのユーザーサービス(rootインスタンスで管理されているサービス)の場合、デフォルトはsystemd --user" root"ですがUser=他のユーザー。 [...]

Jenkinsの場合、systemdはsysv initスクリプトに基づくビルド単位を使用するため、オプションを使用しません/etc/init.d/jenkinsUser生成された単位は非常に基本的です)。systemdは/etc/init.dスクリプトをどのように使用しますか?)。初期化スクリプトが/usr/bin/daemonJenkinsを起動するように呼び出すようです。man 1 daemon:

The preparatory tasks that daemon performs for other processes are:
[...]

•   Change the process uid and gid if the --user option was supplied. Only root can use
    this option. Note that the uid of daemon itself is changed, rather than just changing
    the uid of the client process.

ただし、このオプションは出力には存在しないため、ps他の方法を使用してUIDを変更できます。/etc/init.d/jenkins詳しくは、スクリプトを確認してください。

おすすめ記事