Existe uma maneira de selecionar por várias condições em 'ps'?

10

Parece que estou perdendo algo que é óbvio, mas ainda assim:

ps -f -u myuser --ppid 1

Parece apenas dar uma olhada no pid pai do processo, e retorna todos os processos que têm o pai pid de 1 - mesmo quando o usuário não é myuser .

O -u sozinho funciona corretamente (selecionando apenas processos de myuser ):

ps -f -u myuser

O que estou perdendo? Existe alguma maneira interna de filtrar por várias condições em ps ?

EDITAR: Minha solução atual:

ps -f -p $(join <(ps h --ppid 1 -o pid | sort) <(ps h -u myuser -o pid | sort))
    
por Rogach 26.07.2013 / 06:25

4 respostas

10

ps é irritante dessa maneira. Felizmente, há pgrep , que tem opções de seleção semelhantes, mas exige que todas correspondam e produz os pids correspondentes. Por padrão, ele gera uma por linha, mas pode ser solicitado que use um delimitador diferente para que funcione com ps :

ps -f -p"$(pgrep -d, -u $USER -P 1)"
    
por 26.07.2013 / 09:17
4

Infelizmente, ps só pode desmarcar, não parece haver nem um operador and nem a capacidade de adicionar refinamentos.

Você pode solicitar a ajuda de pgrep para obter uma lista de PIDs e alimentar isso para ps . Por exemplo:

$ 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
    
por 26.07.2013 / 14:22
2

ps não possui filtros muito flexíveis. Faça com que exiba mais do que o necessário, especifique o formato explicitamente e filtre a saída. O awk geralmente funciona bem para essa tarefa.

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

Os sinais de igual após os nomes das colunas suprimem a linha do cabeçalho. Se você quiser ver as linhas de cabeçalho, faça o filtro imprimir a primeira linha inalterada:

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

Se você quiser fazer algum processamento automatizado, precisará remover os dados apenas para os PIDs.

ps -o pid= -o ppid= -o user= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid {print $1}'
    
por 30.07.2013 / 04:00
0

Eu tive que checar o PID iniciado pelo meu lote, então eu tive que checar um PID e um PPID, esse grep foi mais útil para mim:

grep -c $$ /proc/CHILDPID/stat
    
por 25.05.2018 / 11:51

Tags