localizando a unidade systemd 'proprietária' de um processo daemon em execução


25

Para depurar um problema do JACK / Pulseaudio, quero entender quando e por que o daemon pulseaudio é iniciado pelo systemd (no Fedora).

Usando:

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

Vejo que o daemon pulseaudio está sendo iniciado pelo systemd (pid = 1)

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

No entanto, não consegui encontrar nenhum arquivo de unidade no meu sistema contendo pulseaudioou mesmo apenas pulse.

Minhas perguntas específicas são:

A) Existe uma maneira de determinar a unidade systemd que causou a criação de um processo específico (no meu exemplo de saída, processo 2738, o daemon PA)?

B) Existem abordagens alternativas para descobrir qual cadeia de dependência de unidade ou outras configurações do systemd resultaram na invocação de /usr/bin/pulseaudio --start?

Respostas:


24

A) Existe uma maneira de determinar a unidade systemd que causou a criação de um processo específico (no meu exemplo de saída, processo 2738, o daemon PA)?

Certo. Você pode executar systemctl status <pid>e o systemd encontrará a unidade que contém esse PID. Por exemplo, no meu sistema, encontro um dnsmasqprocesso:

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

Quem começou?

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

Eu também tenho um pulseaudioprocesso:

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

Correndo systemctl status 2948, eu vejo:

● 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

Isso me diz que pulseaudiofoi iniciado a partir da minha sessão de login na área de trabalho, em vez de explicitamente via systemd.


1
Eu queria encontrar uma maneira de escrever isso. systemctltem uma --propertyopção para selecionar quais propriedades da unidade exibir, mas infelizmente isso funciona apenas com shownão statuse shownão funciona com PIDs. O melhor que eu pude criar é:systemctl status -n0 $PID 2>/dev/null | head -n1 | awk '{print $2}'
Neil Mayhew

@NeilMayhew Ver ps -o unitresposta por Lukáš. Supondo que você esteja em um sistema moderno e funcione, é uma coisa bonita.
rsaw

6

A propósito, você pode pedir ao ps para mostrar a unidade systemd correspondente.

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

Isso não funciona para mim, e noto que man psdiz "se o suporte ao systemd foi incluído". Então, presumo que seja dependente do sistema.
Neil Mayhew

Impressionante! E seria ainda melhor com a ps -C CMDopção subutilizada , por exemplo ps -o pid,args,unit -C pulseaudio,.
rsaw

4

Observe que um processo com um PPID pai de 1 não significa que ele foi criado pelo systemd. Qualquer processo que perde o processo pai é automaticamente redesignado ao pai 1.

Você pode ver a hierarquia dos processos systemd com

systemctl status

que mostra para mim entre outras coisas (editadas):

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

Obrigado por apontar minha falácia sobre o PPID == 1. Na verdade, eu já sabia disso e acabei de me esquecer disso ao pensar sobre essa questão.
Neradis 27/08/15
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.