我想了解如何systemd
启动服务,特别是服务以哪个用户身份启动,我想以在我的 Linux PC 上运行的 Jenkins 为例。
我知道那init
是pid 1
Linux 中所有进程之母,在我的例子中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 身份运行。
但我认为詹金斯在我的电脑上运行admin
。
我试图用它来systemctl
确定 Jenkins 以哪个用户身份运行,但我没有在标准输出中看到任何用户信息:
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
运行的用户与服务运行的用户之间的关系吗?如果答案可以将其与 Jenkins 在这台 Linux PC 上的具体情况联系起来,那就太好了。
systemd 用于运行系统服务的默认用户确实是
root
,但当然可以使用该User
选项自定义。来自man 5 systemd.exec
:在您的 Jenkins 案例中,systemd 使用的是基于 sysv init script 的生成单元
/etc/init.d/jenkins
,因此它没有使用该User
选项(生成的单元非常基本:systemd 如何使用 /etc/init.d 脚本?)。init 脚本似乎在调用/usr/bin/daemon
以启动 Jenkins,并且来自man 1 daemon
:但是,输出中不存在此选项
ps
,因此它可能使用其他方式更改 UID。检查/etc/init.d/jenkins
脚本以找出答案。