서비스를 시작하는 방법, 특히 어떤 사용자가 서비스를 시작하는지 이해하고 싶고 systemd
Linux 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/daemon
Jenkins를 시작하도록 호출하는 것 같습니다.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 애플리케이션을 시작하려고 시도합니다.