encontrar la unidad systemd 'propietaria' de un proceso de demonio en ejecución

25

Para depurar un problema de JACK / Pulseaudio, quiero entender cuándo y por qué systemd (en Fedora) inicia el demonio pulseaudio.

Utilizando:

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

Veo que systemd está iniciando el demonio pulseaudio (pid = 1)

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

Sin embargo, no pude encontrar ningún archivo de unidad en mi sistema que contenga pulseaudioo incluso solo pulse.

Mis preguntas específicas son:

A) ¿Hay alguna forma de determinar la unidad systemd que causó la creación de un proceso específico (en mi salida de ejemplo, proceso 2738, el demonio PA)?

B) ¿Existen enfoques alternativos para averiguar qué cadena de dependencia de unidades u otras configuraciones de systemd resultaron en la invocación de /usr/bin/pulseaudio --start?

neradis
fuente

Respuestas:

24

A) ¿Hay alguna forma de determinar la unidad systemd que causó la creación de un proceso específico (en mi salida de ejemplo, proceso 2738, el demonio PA)?

Seguro. Puede ejecutar systemctl status <pid>y systemd le encontrará la unidad que contiene ese PID. Por ejemplo, en mi sistema encuentro un dnsmasqproceso:

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

¿Quién lo comenzó?

# 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 --...

También tengo un pulseaudioproceso:

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

Corriendo systemctl status 2948, veo:

● 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

Esto me dice que pulseaudiose inició desde mi sesión de inicio de sesión de escritorio, en lugar de explícitamente a través de systemd.

larsks
fuente
1
Quería encontrar una manera de escribir esto. systemctltiene una --propertyopción para seleccionar qué propiedades de unidad mostrar, pero desafortunadamente esto solo funciona con shownot statusy showno con PID. Lo mejor que se me ocurrió es:systemctl status -n0 $PID 2>/dev/null | head -n1 | awk '{print $2}'
Neil Mayhew el
@NeilMayhew Ver la ps -o unitrespuesta de Lukáš. Asumiendo que estás en un sistema moderno y funciona, es algo hermoso.
rsaw
6

Por cierto, puede pedirle a ps que muestre la unidad systemd correspondiente.

[lnykryn@notas]$ ps -o'pid,ppid,args,unit' `pgrep pulse`
  PID  PPID COMMAND                     UNIT
 1345     1 /usr/bin/pulseaudio --start session-1.scope
Lukáš Nykrýn
fuente
Esto no funciona para mí y me doy cuenta de que man psdice "si se ha incluido el soporte de systemd". Así que supongo que depende del sistema.
Neil Mayhew
¡Increíble! Y sería aún mejor con el infrautilizado ps -C CMDopción, por ejemplo, ps -o pid,args,unit -C pulseaudio.
rsaw
4

Tenga en cuenta que un proceso que tiene un PPID primario de 1 no significa que fue creado por systemd. Cualquier proceso que pierde su proceso padre se reasigna automáticamente al padre 1.

Puede ver la jerarquía de procesos systemd con

systemctl status

que muestra para mí entre otras cosas (editado):

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
meuh
fuente
Gracias por señalar mi falacia sobre PPID == 1. En realidad, ya lo sabía y simplemente lo olvidé al pensar en esta pregunta.
neradis