ps
est ennuyeux de cette façon. Heureusement, il y a pgrep
, qui a des options de sélection similaires, mais les oblige toutes à correspondre, puis affiche les pid correspondants. Par défaut, il en sort un 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)"
Malheureusement ps
ne peut que désélectionner, il ne semble pas y avoir de and
opérateur ou la possibilité d'ajouter des améliorations.
Vous pouvez demander l'aide de pgrep
pour obtenir une liste de PID et la transmettre à ps
toutefois. 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
ps
n'a pas de filtres très flexibles. Faites-en afficher plus que ce dont vous avez besoin, spécifiez explicitement le format 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 égal 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 sans la modifier :
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 pour les PID.
ps -o pid= -o ppid= -o user= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid {print $1}'