Existe-t-il un moyen de sélectionner par plusieurs conditions dans `ps`?


12

Il semble que je manque quelque chose d'une évidence aveuglante, mais quand même:

ps -f -u myuser --ppid 1

Semble ne regarder que le pid parent du processus et renvoie tous les processus qui ont un pid parent de 1 - même lorsque l'utilisateur ne l'est pas myuser.

Le -useul fonctionne correctement (en sélectionnant uniquement les processus de myuser):

ps -f -u myuser

Qu'est-ce que je rate? Existe-t-il un moyen intégré de filtrer par plusieurs conditions ps?

EDIT: Ma solution de contournement actuelle:

ps -f -p $(join <(ps h --ppid 1 -o pid | sort) <(ps h -u myuser -o pid | sort))

Réponses:


12

psest ennuyeux de cette façon. Heureusement, il y a pgrep, qui a des options de sélection similaires, mais les oblige tous à correspondre, puis génère les pids correspondants. Par défaut, il en génère une par ligne, mais on peut lui demander d'utiliser un délimiteur différent pour qu'il fonctionne avec ps:

ps -f -p"$(pgrep -d, -u $USER -P 1)"

4

Malheureusement ps, il ne peut que désélectionner, il ne semble y avoir ni andopérateur ni possibilité d'ajouter des améliorations.

Vous pouvez demander l'aide de pgreppour obtenir une liste des PID et les alimenter ps. Par exemple:

$ ps -f $(pgrep -P 1 -u saml)
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
saml      1986     1  0 Jul25 ?        SLl    0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
saml      2003     1  0 Jul25 ?        S      0:00 dbus-launch --sh-syntax --exit-with-session
saml      2004     1  0 Jul25 ?        Ss     0:23 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
saml      2147     1  0 Jul25 ?        S      0:04 /usr/libexec/gconfd-2
saml      2156     1  0 Jul25 ?        Ssl    0:09 /usr/libexec/gnome-settings-daemon
saml      2162     1  0 Jul25 ?        S      0:00 /usr/libexec/gvfsd
saml      2178     1  0 Jul25 ?        Ssl    0:01 /usr/bin/pulseaudio --start --log-target=syslog
saml      2180     1  0 Jul25 ?        Ssl    0:04 /usr/libexec//gvfs-fuse-daemon /home/saml/.gvfs
saml      2191     1  0 Jul25 ?        S      0:12 syndaemon -i 0.5 -k
saml      2193     1  0 Jul25 ?        S      0:00 /usr/libexec/gvfs-gdu-volume-monitor

2

psn'a pas de filtres très flexibles. Faites-le afficher plus que ce dont vous avez besoin, spécifiez le format explicitement et filtrez la sortie. Awk fonctionnera souvent bien pour cette tâche.

ps -o pid= -o ppid= -o user= -o comm= -o args= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid'

Les signes égaux après les noms de colonne suppriment la ligne d'en-tête. Si vous voulez voir les lignes d'en-tête, faites en sorte que le filtre imprime la première ligne inchangée:

ps -o pid -o ppid -o user -o comm -o args |
awk -v uid="$(id -un myuser)" 'NR == 1 || ($2 == 1 && $3 == uid)'

Si vous souhaitez effectuer un traitement automatisé, vous devrez supprimer les données uniquement aux PID.

ps -o pid= -o ppid= -o user= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid {print $1}'

0

J'ai dû vérifier les PID démarrés par mon lot, j'ai donc dû vérifier un PID et un PPID, ce grep m'a été plus utile:

grep -c $$ /proc/CHILDPID/stat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.