找到“拥有”正在运行的守护进程的 systemd 单元

ner*_*dis 31 fedora systemd pulseaudio

为了调试 JACK/Pulseaudio 问题,我想了解 systemd(在 Fedora 上)何时以及为何启动pulseaudio 守护程序。

使用:

$ ps -o'pid,ppid,args' `pgrep pulse`
Run Code Online (Sandbox Code Playgroud)

我看到 systemd 正在启动pulseaudio守护进程(pid=1)

 PID  PPID COMMAND
2738     1 /usr/bin/pulseaudio --start
Run Code Online (Sandbox Code Playgroud)

但是,我无法在我的系统上找到任何包含pulseaudio或什至仅包含pulse.

我的具体问题是:

A) 有没有办法确定导致创建特定进程的 systemd 单元(在我的示例输出中,进程 2738,PA 守护程序)?

B) 是否有其他方法可以找出 systemd 的哪个单元依赖链或其他设置导致调用/usr/bin/pulseaudio --start

lar*_*sks 42

A) 有没有办法确定导致创建特定进程的 systemd 单元(在我的示例输出中,进程 2738,PA 守护程序)?

当然。您可以运行systemctl status <pid>,systemd 会为您找到包含该 PID 的单元。例如,在我的系统上,我找到了一个dnsmasq进程:

# ps -fe | grep dnsmasq
nobody   18834  1193  0 Aug25 ?        00:00:10 /usr/sbin/dnsmasq ...
Run Code Online (Sandbox Code Playgroud)

谁开始的?

# 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 --...
Run Code Online (Sandbox Code Playgroud)

我也有一个pulseaudio过程:

# ps -fe | grep pulseaudio
lars      2948     1  0 Aug25 ?        00:06:20 /usr/bin/pulseaudio --start
Run Code Online (Sandbox Code Playgroud)

运行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
Run Code Online (Sandbox Code Playgroud)

这告诉我pulseaudio是从我的桌面登录会话启动的,而不是通过 systemd 显式启动的。


小智 10

顺便说一句,您可以要求 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
Run Code Online (Sandbox Code Playgroud)

  • 惊人的!如果使用未充分使用的“ps -C CMD”选项,例如“ps -o pid,args,unit -Cpulseaudio”,效果会更好。 (2认同)