A) Existe-t-il un moyen de déterminer l'unité systemd qui a provoqué la création d'un processus spécifique (dans mon exemple de sortie, le processus 2738, le démon PA)?
Sûr. Vous pouvez exécuter systemctl status <pid>
et systemd vous trouvera l'unité qui contient ce PID. Par exemple, sur mon système, je trouve un dnsmasq
processus:
# ps -fe | grep dnsmasq
nobody 18834 1193 0 Aug25 ? 00:00:10 /usr/sbin/dnsmasq ...
Qui a commencé?
# 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 --...
J'ai aussi un pulseaudio
processus:
# ps -fe | grep pulseaudio
lars 2948 1 0 Aug25 ? 00:06:20 /usr/bin/pulseaudio --start
Courir systemctl status 2948
, je vois:
● 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
Cela m'indique que a pulseaudio
été démarré à partir de ma session de connexion au bureau, plutôt que explicitement via systemd.
systemctl
a une--property
option pour sélectionner les propriétés d'unité à afficher, mais malheureusement cela ne fonctionne qu'avecshow
nonstatus
, etshow
ne fonctionne pas avec les PID. Le mieux que j'ai pu trouver est:systemctl status -n0 $PID 2>/dev/null | head -n1 | awk '{print $2}'
ps -o unit
réponse de Lukáš. En supposant que vous utilisez un système moderne et que cela fonctionne, c'est une belle chose.Au fait, vous pouvez demander à ps d'afficher l'unité systemd correspondante.
la source
man ps
"si la prise en charge de systemd a été incluse". Je suppose donc que cela dépend du système.ps -C CMD
option sous-utilisée , par exempleps -o pid,args,unit -C pulseaudio
.Remarque, un processus ayant un PPID parent de 1 ne signifie pas qu'il a été créé par systemd. Tout processus qui perd son processus parent est automatiquement réaffecté au parent 1.
Vous pouvez voir la hiérarchie des processus systemd avec
ce qui me montre entre autres choses (édité):
la source