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그것이 실행하는 모든 서비스가 루트로 실행될 것이라고 순진하게 생각했습니다. 하지만 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가 시스템 서비스를 실행하는 데 사용하는 기본 사용자는 실제로는 기본 사용자이지만 옵션을 사용하여 사용자 정의 root할 수 있습니다 . User~에서man 5 systemd.exec:

User=,Group=

프로세스가 실행되는 UNIX 사용자 또는 그룹을 각각 설정합니다. 단일 사용자 이름, 그룹 이름 또는 숫자 ID를 인수로 사용합니다. 시스템 서비스(시스템 서비스 관리자가 실행하는 서비스, 즉 PID 1로 관리되는 서비스) 및 루트 사용자를 위한 사용자 서비스(root 인스턴스로 관리되는 서비스)의 경우 기본값 systemd --user은 " root" 이지만 User=다른 사용자 . [...]

Jenkins의 경우 systemd는 sysv init 스크립트를 기반으로 하는 빌드 단위를 사용하므로 옵션을 /etc/init.d/jenkins사용하지 않습니다 User(생성된 단위는 매우 기본적입니다.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알아보려면 스크립트를 확인하세요 .

답변2

무루의 대답대부분 맞는데, --user버스에 대한 정보를 추가하고 싶습니다.

systemd두 개의 버스가 있습니다: --system--user. 버스가 --system기본값이며 Muru의 답변이 여기에 적용됩니다. 하지만 --user버스에서도 서비스를 시작할 수 있습니다 .

단위 파일은 /lib/systemd/user/또는 에 있으며 ~/.config/systemd/user/이러한 파일은 서비스를 호출하는 사용자로 시작됩니다. WantedBy=default.target사용자가 로그인할 때 서비스가 시작되거나 사용자 WantedBy=graphical.target가 그래픽 세션을 얻을 때 서비스가 시작됩니다.

User=사용자 버스는 시스템 버스 설정의 대안이 아닙니다 . 각 사용자에 대한 서비스 인스턴스를 생성하는 방법을 제공합니다. 예를 들어, 해당 사용자의 자격 증명을 사용하여 홈 디렉터리 어딘가에 sshfs 디렉터리를 마운트하려는 경우 사용자 버스에서 쉽게 수행할 수 있습니다.

또 다른 특징은 사용자 버스가 사용자 환경을 상속한다는 것입니다. 여기에는 DISPLAY및 같은 것이 포함됩니다 XAUTHORITY. 이는 사용자가 데스크탑 환경에 로그인할 때 GUI 응용 프로그램을 시작하는 데 도움이 됩니다. 대조적으로, User=시스템 버스의 설정은 (명시적으로 지정하지 않는 한) 올바른 디스플레이를 찾을 수 없으며 일반적으로 DE가 시작되기 전에 GUI 애플리케이션을 시작하려고 시도합니다.

관련 정보