trovare un'unità di sistema "proprietaria" di un processo daemon in esecuzione


25

Per eseguire il debug di un problema di JACK / Pulseaudio, voglio capire quando e perché il demone pulseaudio è avviato da systemd (su Fedora).

usando:

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

Vedo che il demone pulseaudio viene avviato da systemd (pid = 1)

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

Tuttavia, non sono riuscito a trovare alcun file di unità sul mio sistema contenente pulseaudioo anche solo pulse.

Le mie domande specifiche sono:

A) C'è un modo per determinare l'unità systemd che ha causato la creazione di un processo specifico (nel mio esempio di output, processo 2738, il demone PA)?

B) Esistono approcci alternativi per scoprire quale catena di dipendenza unitaria o altre impostazioni di systemd hanno provocato l'invocazione di /usr/bin/pulseaudio --start?

Risposte:


24

A) C'è un modo per determinare l'unità systemd che ha causato la creazione di un processo specifico (nel mio esempio di output, processo 2738, il demone PA)?

Sicuro. È possibile eseguire systemctl status <pid>e systemd troverà l'unità che contiene quel PID. Ad esempio, sul mio sistema trovo un dnsmasqprocesso:

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

Chi l'ha iniziato?

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

Ho anche un pulseaudioprocesso:

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

In esecuzione systemctl status 2948, vedo:

● 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

Questo mi dice che è pulseaudiostato avviato dalla mia sessione di accesso desktop, piuttosto che esplicitamente tramite systemd.


1
Volevo trovare un modo per scrivere questo. systemctlha --propertyun'opzione per selezionare quali proprietà dell'unità mostrare, ma sfortunatamente funziona solo con shownon statuse shownon funziona con i PID. Il meglio che potrei inventare è:systemctl status -n0 $PID 2>/dev/null | head -n1 | awk '{print $2}'
Neil Mayhew,

@NeilMayhew Vedi la ps -o unitrisposta di Lukáš. Supponendo che tu sia su un sistema moderno e funzioni, è una cosa bellissima.
risposta

6

A proposito, puoi chiedere a ps di mostrare l'unità systemd corrispondente.

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

Questo non funziona per me e noto che man psdice "se è stato incluso il supporto di systemd". Quindi presumo sia dipendente dal sistema.
Neil Mayhew,

Eccezionale! E sarebbe ancora meglio con l' ps -C CMDopzione sottoutilizzata , ad es ps -o pid,args,unit -C pulseaudio.
risposta

4

Nota, un processo con un PPID padre di 1 non significa che è stato creato da systemd. Qualsiasi processo che perde il suo processo padre viene automaticamente riassegnato al padre 1.

Puoi vedere la gerarchia dei processi di systemd con

systemctl status

che mostra per me tra le altre cose (a cura):

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

Grazie per aver sottolineato il mio errore riguardo a PPID == 1. In realtà lo sapevo già e me ne sono dimenticato solo quando ho pensato a questa domanda.
neradis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.