Czy istnieje sposób wyboru według kilku warunków w `ps`?

12

Wygląda na to, że brakuje mi czegoś oślepająco oczywistego, ale nadal:

ps -f -u myuser --ppid 1

Wydaje się, że patrzy tylko na nadrzędny pid procesu i zwraca wszystkie procesy, które mają nadrzędny pid równy 1 - nawet gdy użytkownik nie jest myuser.

Te -usame działa poprawnie (wybierając przetwarza tylko myuser):

ps -f -u myuser

czego mi brakuje? Czy jest jakiś wbudowany sposób filtrowania według kilku warunków ps?

EDYCJA: Moje obecne obejście:

ps -f -p $(join <(ps h --ppid 1 -o pid | sort) <(ps h -u myuser -o pid | sort))
Rogach
źródło

Odpowiedzi:

12

psjest w ten sposób denerwujące. Na szczęście istnieje pgrep, który ma podobne opcje wyboru, ale wymaga, aby wszystkie pasowały, a następnie wyświetla pasujące pidy. Domyślnie wyświetla jeden na linię, ale można go poprosić o użycie innego separatora, aby działał z ps:

ps -f -p"$(pgrep -d, -u $USER -P 1)"
rici
źródło
4

Niestety psmożna jedynie odznaczyć, nie ma ani andoperatora, ani możliwości dodawania udoskonaleń.

Możesz poprosić o pomoc, pgrepaby uzyskać listę PID i karmić ją psjednak. Na przykład:

$ 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
źródło
2

psnie ma bardzo elastycznych filtrów. Spraw, by wyświetlał się więcej niż potrzebujesz, jawnie określ format i filtruj dane wyjściowe. Awk często będzie dobrze działać do tego zadania.

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

Znaki równości po nazwach kolumn pomijają wiersz nagłówka. Jeśli chcesz zobaczyć linie nagłówka, filtr wydrukuj pierwszy wiersz bez zmian:

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

Jeśli chcesz wykonać zautomatyzowane przetwarzanie, musisz rozebrać dane tylko do PID.

ps -o pid= -o ppid= -o user= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid {print $1}'
Gilles „SO- przestań być zły”
źródło
0

Musiałem sprawdzić PID rozpoczęty przez moją partię, więc musiałem sprawdzić PID i PPID, ten grep był dla mnie bardziej przydatny:

grep -c $$ /proc/CHILDPID/stat
Ragnarok
źródło