menemukan unit systemd 'memiliki' proses daemon yang berjalan

25

Untuk men-debug masalah JACK / Pulseaudio, saya ingin memahami kapan dan mengapa daemon pulseaudio dimulai oleh systemd (pada Fedora).

Menggunakan:

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

Saya melihat bahwa daemon pulseaudio sedang dijalankan oleh systemd (pid = 1)

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

Namun, saya tidak dapat menemukan file unit di sistem saya yang berisi pulseaudioatau bahkan adil pulse.

Pertanyaan spesifik saya adalah:

A) Apakah ada cara untuk menentukan unit systemd yang menyebabkan penciptaan proses tertentu (dalam contoh saya output, proses 2738, daemon PA)?

B) Apakah ada pendekatan alternatif untuk mengetahui rantai ketergantungan unit apa atau pengaturan sistem lainnya yang mengakibatkan permohonan /usr/bin/pulseaudio --start?

neradis
sumber

Jawaban:

24

A) Apakah ada cara untuk menentukan unit systemd yang menyebabkan penciptaan proses tertentu (dalam contoh saya output, proses 2738, daemon PA)?

Yakin. Anda dapat menjalankan systemctl status <pid>dan systemd akan menemukan Anda unit yang berisi PID itu. Misalnya, pada sistem saya, saya menemukan dnsmasqproses:

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

Siapa yang memulai?

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

Saya juga punya pulseaudioproses:

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

Berjalan systemctl status 2948, saya melihat:

● 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

Ini memberitahu saya pulseaudioitu dimulai dari sesi login desktop saya, daripada secara eksplisit melalui systemd.

larsks
sumber
1
Saya ingin menemukan cara untuk skrip ini. systemctlmemiliki --propertyopsi untuk memilih properti unit mana yang akan ditampilkan, tetapi sayangnya ini hanya berfungsi dengan showtidak status, dan showtidak bekerja dengan PID. Yang terbaik yang bisa saya systemctl status -n0 $PID 2>/dev/null | head -n1 | awk '{print $2}'
Neil Mayhew
@NeilMayhew Lihat ps -o unitjawaban oleh Lukáš. Dengan asumsi Anda menggunakan sistem modern dan berfungsi, itu adalah hal yang indah.
rsaw
6

Omong-omong, Anda dapat meminta ps untuk menampilkan unit systemd yang sesuai.

[lnykryn@notas]$ ps -o'pid,ppid,args,unit' `pgrep pulse`
  PID  PPID COMMAND                     UNIT
 1345     1 /usr/bin/pulseaudio --start session-1.scope
Lukáš Nykrýn
sumber
Ini tidak berfungsi untuk saya, dan saya perhatikan yang man psmengatakan "jika dukungan systemd telah disertakan." Jadi saya menganggap itu tergantung pada sistem.
Neil Mayhew
Luar biasa! Dan akan lebih baik dengan ps -C CMDopsi yang kurang digunakan , misalnya ps -o pid,args,unit -C pulseaudio,.
rsaw
4

Catatan, proses memiliki PPID induk dari 1 tidak berarti itu dibuat oleh systemd. Setiap proses yang kehilangan proses induknya secara otomatis ditugaskan ulang induknya 1.

Anda dapat melihat hierarki proses systemd dengan

systemctl status

yang menunjukkan kepada saya di antara hal-hal lain (diedit):

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
sumber
Terima kasih telah menunjukkan kekeliruan saya tentang PPID == 1. Sebenarnya saya sudah tahu itu dan lupa saja ketika memikirkan pertanyaan ini.
neradis