знаходження системного блоку "володіння" запущеним процесом демона


25

Щоб налагодити проблему JACK / Pulseaudio, я хочу зрозуміти, коли і чому демон pulseaudio запускається systemd (у Fedora).

Використання:

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

Я бачу, що демон імпульсу запускається systemd (pid = 1)

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

Однак мені не вдалося знайти жодного файлового файлу в моїй системі, який би містив pulseaudioабо навіть просто pulse.

Мої конкретні запитання:

A) Чи існує спосіб визначити системний блок, який спричинив створення конкретного процесу (у моєму прикладі вихід, процес 2738, демон PA)?

B) Чи існують альтернативні підходи до з'ясування, який ланцюг залежностей від одиниці чи інші параметри systemd призвів до виклику /usr/bin/pulseaudio --start?

Відповіді:


24

A) Чи існує спосіб визначити системний блок, який спричинив створення конкретного процесу (у моєму прикладі вихід, процес 2738, демон PA)?

Звичайно. Ви можете запустити 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 показати відповідний системний блок.

[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сказано, "якщо підтримка системної системи була включена". Тож я припускаю, що це залежить від системи.
Ніл Мейхью

Дивовижно! І було б ще краще з недостатньо використовуваної ps -C CMDопцією, наприклад, ps -o pid,args,unit -C pulseaudio.
rsaw

4

Зауважте, процес, що має батьківський PPID 1 , не означає, що він був створений systemd. Будь-який процес, який втрачає батьківський процес, автоматично переназначається батьківському 1.

Ви можете бачити ієрархію системних процесів за допомогою

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.