Como assistir pgrep?

1

Ao executar um comando pgrep com watch , ele não mostra apenas a saída real do pgrep, mas também o processo watch .

Exemplo:

watch pgrep -lf donothing

mostrará 3 processos, embora

pgrep -lf donothing

não mostra um. Você é uma maneira elegante de lidar com isso corretamente com watch para não exibir o processo próprio de watch ?

EDITAR

Usando as sugestões de Patrick:

watch pgrep -f '^python donothing.py'

mostra o uso de pgrep (atualizado a cada 2 segundos ...)

watch pgrep -l 'python donothing.py'

também (os comandos pgrep só funcionam, mas não em conexão com watch ).

watch "pgrep 'python donothing.py'"

não mostra nada, embora o processo esteja lá.

    
por Alex 03.04.2013 / 18:20

1 resposta

1

Do seu comentário, você deve estar fazendo pgrep donothing.py ou pgrep -x donothing.py .

Ao usar pgrep -f , ele procura por qualquer comando que tenha a sequência correspondente em seu nome e / ou argumentos. Não há uma maneira bonita de filtrar os resultados. A solução é corresponder exatamente ao que você procura, portanto, corresponda ao nome do processo. Por padrão, pgrep corresponde apenas ao nome do processo. Por padrão, ele procurará por qualquer processo cujo nome contenha a string de correspondência. Com -x , ele procurará por qualquer processo cujo nome corresponda exatamente à string.

pgrep também é inteligente o suficiente para entender os scripts. Se você tiver um script chamado foo.sh , ele será exibido em ps as /bin/sh foo.sh (ou algo semelhante). Neste caso, pgrep irá comparar o nome do script. Então você pode fazer pgrep foo.sh ou pgrep -x foo.sh .

Portanto, no seu caso, você deve estar fazendo pgrep -x donothing.py para obter uma correspondência exata.

EDIT:
Devo observar que isso só funciona se o script foi iniciado como /path/to/donothing.py . Se você iniciar como python donothing.py , não funcionará.

Nesse caso, você precisa usar um regex como pgrep -f '^python donothing.py' .

EDIT2:
O problema que você está encontrando com watch está citando. executando watch pgrep -f '^python donothing.py' runs pgrep sem argumentos. O -f '^python donothing.py' é passado como um argumento para watch , não pgrep como pretendido. Todo o comando pgrep deve ser citado.

watch "pgrep -f '^python donothing.py'"

Como outra nota. Se você vai usar isso para outras coisas, pode ser mais seguro fazer

watch "pgrep -f '(^|\S+/)python donothing.py'"

Isto irá capturar o caso em que o processo aparece como algo como /usr/bin/python em vez de apenas python .

    
por 03.04.2013 / 18:40