tìm đơn vị systemd 'sở hữu' một tiến trình daemon đang chạy


25

Để gỡ lỗi một vấn đề JACK / Pulseaudio, tôi muốn hiểu khi nào và tại sao trình nền pulseaudio được khởi động bởi systemd (trên Fedora).

Sử dụng:

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

Tôi thấy rằng trình nền pulseaudio đang được khởi động bởi systemd (pid = 1)

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

Tuy nhiên, tôi không thể tìm thấy bất kỳ tệp đơn vị nào trên hệ thống của mình có chứa pulseaudiohoặc thậm chí chỉ pulse.

Câu hỏi cụ thể của tôi là:

A) Có cách nào để xác định đơn vị systemd gây ra việc tạo ra một quy trình cụ thể (trong đầu ra ví dụ của tôi, quy trình 2738, daemon PA) không?

B) Có cách tiếp cận khác để tìm ra chuỗi phụ thuộc đơn vị hoặc các cài đặt khác của systemd dẫn đến việc gọi /usr/bin/pulseaudio --start?

Câu trả lời:


24

A) Có cách nào để xác định đơn vị systemd gây ra việc tạo ra một quy trình cụ thể (trong đầu ra ví dụ của tôi, quy trình 2738, daemon PA) không?

Chắc chắn rồi. Bạn có thể chạy systemctl status <pid>và systemd sẽ tìm cho bạn đơn vị chứa PID đó. Ví dụ, trên hệ thống của tôi, tôi tìm thấy một dnsmasqquy trình:

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

Ai bắt đầu nó?

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

Tôi cũng có một pulseaudioquy trình:

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

Chạy systemctl status 2948, tôi thấy:

● 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

Điều này cho tôi biết pulseaudiođã được bắt đầu từ phiên đăng nhập máy tính để bàn của tôi, chứ không phải rõ ràng thông qua systemd.


1
Tôi muốn tìm một cách để kịch bản này. systemctlcó một --propertytùy chọn để chọn các thuộc tính đơn vị nào sẽ hiển thị, nhưng thật không may, điều này chỉ hoạt động với showkhông statusshowkhông hoạt động với các PID. Điều tốt nhất tôi có thể nghĩ ra là:systemctl status -n0 $PID 2>/dev/null | head -n1 | awk '{print $2}'
Neil Mayhew

@NeilMayhew Xem ps -o unitcâu trả lời của Lukáš. Giả sử bạn đang ở trên một hệ thống hiện đại và nó hoạt động, đó là một điều tuyệt vời.
rsaw

6

Bằng cách này, bạn có thể yêu cầu ps hiển thị đơn vị systemd tương ứng.

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

Điều này không phù hợp với tôi và tôi nhận thấy rằng man ps"nếu đã bao gồm hỗ trợ systemd." Vì vậy, tôi cho rằng nó phụ thuộc vào hệ thống.
Neil Mayhew

Tuyệt vời! Và sẽ tốt hơn với underused ps -C CMDtùy chọn, ví dụ ps -o pid,args,unit -C pulseaudio.
rsaw

4

Lưu ý, một quá trình có PPID gốc là 1 không có nghĩa là nó được tạo bởi systemd. Bất kỳ quy trình nào mất quy trình cha mẹ của nó sẽ tự động được gán lại cho cha mẹ 1.

Bạn có thể thấy hệ thống phân cấp của các quy trình systemd với

systemctl status

trong đó hiển thị cho tôi trong số những thứ khác (chỉnh sửa):

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

Cảm ơn bạn đã chỉ ra sai lầm của tôi về PPID == 1. Thật ra tôi đã biết điều đó và chỉ quên nó khi nghĩ về câu hỏi này.
neradis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.