C'è un modo per selezionare in base a diverse condizioni in `ps`?


12

Sembra che mi manchi qualcosa di palesemente ovvio, ma comunque:

ps -f -u myuser --ppid 1

Sembra dare un'occhiata solo al pid parent del processo e restituisce tutti i processi che hanno un pid parent di 1, anche quando l'utente non lo è myuser.

Il -usolo funziona correttamente (selezionando solo i processi di myuser):

ps -f -u myuser

Cosa mi sto perdendo? Esiste un modo integrato per filtrare in base a diverse condizioni ps?

EDIT: la mia soluzione attuale:

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

Risposte:


12

psè fastidioso in questo modo. Fortunatamente, c'è pgrep, che ha opzioni di selezione simili, ma richiede che tutti corrispondano e quindi emetta i pid corrispondenti. Di default ne produce uno per riga, ma può essere richiesto di usare un delimitatore diverso in modo che funzioni con ps:

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

4

Sfortunatamente pspuò solo deselezionare, non sembra esserci né un andoperatore né la possibilità di aggiungere perfezionamenti.

Puoi ottenere l'aiuto di pgrepper ottenere un elenco di PID e fornirglielo ps. Per esempio:

$ 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

psnon ha filtri molto flessibili. Renderlo visualizzato più del necessario, specificare esplicitamente il formato e filtrare l'output. Awk funzionerà spesso bene per questo compito.

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

I segni di uguale dopo i nomi delle colonne sopprimono la riga di intestazione. Se vuoi vedere le righe di intestazione, fai in modo che il filtro stampi la prima riga invariata:

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

Se si desidera eseguire alcune elaborazioni automatiche, è necessario ridurre i dati solo ai PID.

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

0

Ho dovuto verificare la presenza di PID avviati dal mio batch, quindi ho dovuto verificare la presenza di un PID e un PPID, questo grep mi è stato più utile:

grep -c $$ /proc/CHILDPID/stat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.