実行中のデーモンプロセスを「所有」しているsystemdユニットを見つける


25

JACK / Pulseaudioの問題をデバッグするために、pulseaudioデーモンがsystemd(Fedoraで)によって起動されるタイミングと理由を理解したいと思います。

を使用して:

$ ps -o'pid,ppid,args' `pgrep pulse`

pulseaudioデーモンがsystemd(pid = 1)によって起動されていることがわかります

 PID  PPID COMMAND
2738     1 /usr/bin/pulseaudio --start

しかし、私はシステム上にを含む、pulseaudioまたはだけのユニットファイルを見つけることができませんでしたpulse

私の具体的な質問は次のとおりです。

A)特定のプロセス(私の出力例では、プロセス2738、PAデーモン)の作成を引き起こしたsystemdユニットを特定する方法はありますか?

B)systemdのどのユニット依存チェーンまたは他の設定が呼び出しを引き起こしたかを調べるための代替アプローチはあります/usr/bin/pulseaudio --startか?

回答:


24

A)特定のプロセス(私の出力例では、プロセス2738、PAデーモン)の作成を引き起こしたsystemdユニットを特定する方法はありますか?

確かに。実行するsystemctl status <pid>と、systemdはそのPIDを含むユニットを見つけます。たとえば、私のシステムでdnsmasqプロセスを見つけます:

# ps -fe | grep dnsmasq
nobody   18834  1193  0 Aug25 ?        00:00:10 /usr/sbin/dnsmasq ...

誰が始めたの?

# systemctl status 18834
● NetworkManager.service - Network Manager
   Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2015-08-25 11:07:40 EDT; 1 day 21h ago
 Main PID: 1193 (NetworkManager)
   Memory: 1.1M
   CGroup: /system.slice/NetworkManager.service
           ├─ 1193 /usr/sbin/NetworkManager --no-daemon
           ├─ 1337 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-wlp3s0....
           ├─18682 /usr/libexec/nm-openvpn-service
           ├─18792 /usr/sbin/openvpn --remote ovpn-phx2.redhat.com 443 tcp --nobind --dev redhat --de...
           └─18834 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --...

私もpulseaudioプロセスがあります:

# ps -fe | grep pulseaudio
lars      2948     1  0 Aug25 ?        00:06:20 /usr/bin/pulseaudio --start

実行中systemctl status 2948、私は見る:

● session-3.scope - Session 3 of user lars
   Loaded: loaded (/run/systemd/system/session-3.scope; static; vendor preset: disabled)
  Drop-In: /run/systemd/system/session-3.scope.d
           └─50-After-systemd-logind\x2eservice.conf, 50-After-systemd-user-sessions\x2eservice.conf, 50-Description.conf, 50-SendSIGHUP.conf, 50-Slice.conf
   Active: active (running) since Tue 2015-08-25 11:09:23 EDT; 1 day 21h ago
   CGroup: /user.slice/user-1000.slice/session-3.scope

これは、pulseaudiosystemdを介して明示的にではなく、デスクトップログインセッションから開始されたことを示しています。


1
これをスクリプト化する方法を見つけたかったのです。表示するユニットプロパティを選択systemctlする--propertyオプションがありますが、残念なことに、これはshownot statusでのみshow機能し、PIDでは機能しません。私が思い付くことができる最高は次のとおりです。systemctl status -n0 $PID 2>/dev/null | head -n1 | awk '{print $2}'
ニール・メイヒュー

@NeilMayhew ps -o unitルカシュの回答をご覧ください。あなたが最新のシステムで動作していると仮定すると、それは美しいものです。
rsaw

6

ところで、psに対応するsystemdユニットを表示するように依頼できます。

[lnykryn@notas]$ ps -o'pid,ppid,args,unit' `pgrep pulse`
  PID  PPID COMMAND                     UNIT
 1345     1 /usr/bin/pulseaudio --start session-1.scope

これは私にとってはうまくいかず、man ps「systemdサポートが含まれている場合」と言うことに気付きます。だから私はそれがシステムに依存していると思います。
ニールメイヒュー

驚くばかり!そして、利用されていないとしても良いだろうps -C CMD、例えばオプション、ps -o pid,args,unit -C pulseaudio
rsaw

4

親PPIDが1のプロセスは、systemdによって作成されたという意味ではありません。親プロセスを失ったプロセスは、自動的に親に再割り当てされます1。

systemdプロセスの階層は次のように表示できます

systemctl status

これは、他のもの(編集済み)の中に私のために表示されます:

CGroup: 
|-1 /usr/lib/systemd/systemd --system --deserialize 17
|-system.slice
`-user.slice
  `-user-1000.slice
    |-session-66.scope
    | |-4108 /bin/dbus-launch --autolaunch ...
    | |-4109 /bin/dbus-daemon --fork ...
    | `-5985 /usr/bin/pulseaudio --start --log-target=syslog

PPID == 1についての私の誤りを指摘してくれてありがとう。実際、私はそれをすでに知っていたので、この質問について考えるときにそれを忘れていました。
neradis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.