サービスを開始する方法、特にどのユーザーがサービスを開始するのかを理解したいと思い、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として実行されているので、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がシステムサービスの実行に使用するデフォルトユーザーは実際にはデフォルトユーザーですが、オプションを使用してカスタマイズできますroot
。User
~からman 5 systemd.exec
:
User=
、Group=
プロセスが実行されるUNIXユーザーまたはグループをそれぞれ設定します。単一のユーザー名、グループ名、または数値IDを引数として使用します。システムサービス(システムサービス管理者が実行するサービス、つまりPID 1で管理されているサービス)とrootユーザーのユーザーサービス(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
2つのバスがあります: --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アプリケーションを起動しようとします。