¿Hay alguna forma de seleccionar por varias condiciones en `ps`?

12

Parece que me falta algo cegadoramente obvio, pero aún así:

ps -f -u myuser --ppid 1

Parece solo echar un vistazo al padre pid del proceso, y devuelve todos los procesos que tienen padre pid de 1, incluso cuando el usuario no lo es myuser.

El -usolo funciona correctamente (seleccionando solo procesos de myuser):

ps -f -u myuser

¿Qué me estoy perdiendo? ¿Hay alguna forma integrada de filtrar por varias condiciones ps?

EDITAR: Mi solución actual:

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

Respuestas:

12

pses molesto de esa manera. Afortunadamente, existe pgrep, que tiene opciones de selección similares, pero requiere que todas coincidan y luego genera los pids coincidentes. De forma predeterminada, genera uno por línea, pero se le puede pedir que use un delimitador diferente para que funcione con ps:

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

Desafortunadamente ps, solo puede anular la selección, no parece haber un andoperador o la capacidad de agregar refinamientos.

Sin embargo, puede obtener la ayuda de pgreppara obtener una lista de PID y alimentarla ps. Por ejemplo:

$ 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
slm
fuente
2

psNo tiene filtros muy flexibles. Haga que muestre más de lo que necesita, especifique el formato explícitamente y filtre la salida. Awk a menudo funcionará bien para esta tarea.

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

Los signos iguales después de los nombres de columna suprimen la línea de encabezado. Si desea ver las líneas del encabezado, haga que el filtro imprima la primera línea sin cambios:

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

Si desea realizar un procesamiento automatizado, deberá desglosar los datos solo en los PID.

ps -o pid= -o ppid= -o user= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid {print $1}'
Gilles 'SO- deja de ser malvado'
fuente
0

Tuve que verificar los PID iniciados por mi lote, así que tuve que verificar un PID y un PPID, este grep fue más útil para mí:

grep -c $$ /proc/CHILDPID/stat
Ragnarok
fuente