znalezienie jednostki systemowej „będącej właścicielem” działającego procesu demona


25

Aby debugować problem z JACK / Pulseaudio, chcę zrozumieć, kiedy i dlaczego demon pulseaudio jest uruchamiany przez systemd (na Fedorze).

Za pomocą:

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

Widzę, że demon pulseaudio jest uruchamiany przez systemd (pid = 1)

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

Jednak nie mogłem znaleźć w moim systemie żadnego pliku jednostkowego zawierającego, pulseaudioa nawet po prostu pulse.

Moje konkretne pytania to:

A) Czy istnieje sposób na określenie systemowej jednostki, która spowodowała utworzenie określonego procesu (w moim przykładowym wyniku, proces 2738, demon PA)?

B) Czy istnieją alternatywne podejścia, aby dowiedzieć się, który łańcuch zależności od jednostki lub inne ustawienia systemd spowodowały wywołanie /usr/bin/pulseaudio --start?

Odpowiedzi:


24

A) Czy istnieje sposób na określenie systemowej jednostki, która spowodowała utworzenie określonego procesu (w moim przykładowym wyniku, proces 2738, demon PA)?

Pewnie. Możesz uruchomić, systemctl status <pid>a systemd znajdzie jednostkę, która zawiera ten PID. Na przykład w moim systemie znajduję dnsmasqproces:

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

Kto to zaczął?

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

Mam również pulseaudioproces:

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

Biegam systemctl status 2948, widzę:

● 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

To mówi mi, że pulseaudiozaczęło się od mojej sesji logowania na pulpicie, zamiast jawnie przez systemd.


1
Chciałem znaleźć sposób na napisanie tego. systemctlma --propertyopcję wyboru właściwości jednostki do wyświetlenia, ale niestety działa to tylko z shownie statusi shownie działa z PID. Najlepsze, co mogłem wymyślić, to:systemctl status -n0 $PID 2>/dev/null | head -n1 | awk '{print $2}'
Neil Mayhew

@NeilMayhew Patrz ps -o unitodpowiedź: Lukáš. Zakładając, że masz nowoczesny system i działa, to piękna rzecz.
rsaw

6

Przy okazji możesz poprosić ps o pokazanie odpowiedniej jednostki systemowej.

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

To nie działa dla mnie i zauważam, że man psmówi „jeśli wsparcie systemowe zostało uwzględnione”. Zakładam więc, że to zależy od systemu.
Neil Mayhew

Niesamowite! I byłoby jeszcze lepiej z niewykorzystaną ps -C CMDopcją, np ps -o pid,args,unit -C pulseaudio.
rsaw

4

Uwaga: proces mający nadrzędny identyfikator PPID 1 nie oznacza, że został utworzony przez systemd. Każdy proces, który traci swój proces nadrzędny, jest automatycznie ponownie przypisywany do rodzica 1.

Możesz zobaczyć hierarchię systemowych procesów za pomocą

systemctl status

który pokazuje mi między innymi (edytowane):

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

Dziękuję za zwrócenie uwagi na mój błąd dotyczący PPID == 1. Właściwie już to wiedziałem i zapomniałem o tym, myśląc o tym pytaniu.
neradis
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.