查找系统单元“拥有”一个正在运行的守护进程


25

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

使用:

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

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

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

但是,我在系统上找不到包含pulseaudio甚至的任何单位文件pulse

我的具体问题是:

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

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

Answers:


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

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


1
我想找到一种编写脚本的方法。systemctl有一个--property用于选择单元属性显示的选项,但不幸的是这仅适用于show没有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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.