найти системный модуль, «владеющий» запущенным процессом демона

25

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

С помощью:

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

Я вижу, что Pulseaudio Daemon запускается systemd (pid = 1)

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

Тем не менее, я не смог найти какой-либо модуль-файл в моей системе, содержащий pulseaudioили даже просто pulse.

Мои конкретные вопросы:

А) Есть ли способ определить системный модуль, который вызвал создание определенного процесса (в моем примере выходных данных, процесс 2738, демон PA)?

Б) Существуют ли альтернативные подходы, чтобы выяснить, какая цепочка зависимостей модулей или другие настройки systemd привели к вызову /usr/bin/pulseaudio --start?

neradis
источник

Ответы:

24

А) Есть ли способ определить системный модуль, который вызвал создание определенного процесса (в моем примере выходных данных, процесс 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.

larsks
источник
1
Я хотел найти способ написать это. systemctlимеет --propertyвозможность выбрать, какие свойства объекта показывать, но, к сожалению, это работает только с shownot statusи showне работает с PID. Лучшее, что я мог придумать, это:systemctl status -n0 $PID 2>/dev/null | head -n1 | awk '{print $2}'
Нил Мэйхью
@NeilMayhew Смотрите ps -o unitответ Лукача . Предполагая, что вы работаете в современной системе, и она работает, это прекрасно.
выслать
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написано "если включена поддержка systemd". Поэтому я предполагаю, что это зависит от системы.
Нил Мэйхью
Потрясающе! И было бы еще лучше с недостаточно используемой ps -C CMDопцией, например, ps -o pid,args,unit -C pulseaudio.
выслать
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
meuh
источник
Спасибо за указание на мою ошибку по поводу PPID == 1. На самом деле я уже знал это и просто забыл об этом, когда думал об этом вопросе.
neradis