Comment trouver le groupe de contrôle d'un processus particulier?

18

Existe-t-il une méthode pour obtenir cgroupdu processus?

Le seul paquet que je connaisse ( cgroup-bin), fournit juste quelques manipulations avec cgroups et permet de changer cgroup de processus / liste de processus, mais aucune capacité de connaître les informations sur cgroup d'un processus particulier.

zerospiel
la source
10
Essayezps -o cgroup <pid>
Matthew Ife
5
cat / proc / <pid> / cgroup
c4f4t0r
@MIfe, oui, vous avez raison, ty beaucoup. C'est ce dont j'ai besoin
zerospiel
@ c4f4t0r, votre méthode n'est pas si bonne, elle me fournit simplement tous les contrôleurs disponibles, mais pas le groupe d'un processus, mais vous aussi.
zerospiel
@MIfe c'est vrai, désolé, l'autre option est grep sur le fichier de tâches, par exemple grep <pid> / cgroup / cpuset / app1 / tasks
c4f4t0r

Réponses:

16

Utilisation de systemd (PID 3378 par exemple):

# systemctl status 3378 | grep CGroup
CGroup: /user.slice/user-1000.slice/session-3.scope

Utilisation de proc:

# cat /proc/3378/cgroup 
10:memory:/user.slice/user-1000.slice
9:blkio:/user.slice/user-1000.slice
8:net_cls,net_prio:/
7:cpu,cpuacct:/user.slice/user-1000.slice
6:perf_event:/
5:freezer:/
4:cpuset:/
3:pids:/user.slice/user-1000.slice
2:devices:/user.slice/user-1000.slice
1:name=systemd:/user.slice/user-1000.slice/session-3.scope

Recherche dans / sys /:

# cd /sys/fs/ && find * -name "*.procs" -exec grep 3378 {} /dev/null \; 2> /dev/null
cgroup/memory/user.slice/user-1000.slice/cgroup.procs:3378
cgroup/blkio/user.slice/user-1000.slice/cgroup.procs:3378
cgroup/net_cls,net_prio/cgroup.procs:3378
cgroup/cpu,cpuacct/user.slice/user-1000.slice/cgroup.procs:3378
cgroup/perf_event/cgroup.procs:3378
cgroup/freezer/cgroup.procs:3378
cgroup/cpuset/cgroup.procs:3378
cgroup/pids/user.slice/user-1000.slice/cgroup.procs:3378
cgroup/devices/user.slice/user-1000.slice/cgroup.procs:3378
cgroup/systemd/user.slice/user-1000.slice/session-3.scope/cgroup.procs:3378
Rfraile
la source
La dernière commande correspondrait également aux données sur le processus dont le pid est 13378, ou 23378, ou 33378, etc.
Patrick Mevzek
8

Le moyen le plus rapide d'afficher le groupe de contrôle d'un processus est par nom de processus, en utilisant ce script bash:

#!/bin/bash
THISPID=`ps -eo pid,comm | grep $1 | awk '{print $1}'`
cat /proc/$THISPID/cgroup
John Greene
la source
4
utiliser pgrep, pasps | grep | awk
Patrick
4

De RHEL7 et plus, et sur quelques autres distributions, je trouve cet utilitaire utile:

$ systemd-cgtop

Avant de l' utiliser, assurez-vous d' avoir DefaultCPUAccounting=yesen /etc/systemd/system.conf.

J'ai même apporté quelques améliorations au script d'Egbert qui est toujours utile et j'ai utilisé la suggestion de Patrick pgrep:

#!/bin/bash
echo "PID  SLICE   SERVICE"
for THISPID in `pgrep $1`; do
  SLICE=$(cat /proc/$THISPID/cgroup | grep '^1:' | awk -F/ '{ print $2 }')
  SERVICE=$(cat /proc/$THISPID/cgroup | grep '^1:' | awk -F/ '{ print $3 }')
  echo "$THISPID $SLICE $SERVICE"
done
Dirk Krijgsman
la source