Como evitar que “ps” relate seu próprio processo?

49
$ ps | grep django
28006 ttys004    0:01.12 /usr/bin/python bin/django celeryd --beat
51393 ttys005    0:01.45 /usr/bin/python bin/django celeryd -l INFO
51472 ttys005    0:01.29 /usr/bin/python bin/django celeryd -l INFO
51510 ttys005    0:01.89 /usr/bin/python bin/django celeryd -l INFO
51801 ttys005    0:01.83 /usr/bin/python bin/django celeryd -l INFO
53470 ttys005    0:03.97 /usr/bin/python bin/django celeryd -l INFO
53780 ttys005    0:00.00 grep django

Existe uma maneira de impedir que o último processo (isto é, o grep que foi iniciado ao mesmo tempo que o meu comando ps) seja reportado?

(Eu comecei a tentar criar um regex que correspondesse ao literal, mas não correspondesse a si mesmo, mas que parecia não ser a abordagem correta ...)

    
por Steve Bennett 09.03.2012 / 06:42

6 respostas

12

Minha resposta é uma variação da resposta típica para pesquisar por "foobar" em uma listagem ps . O argumento de "-A" "ps" é mais portátil que "aux" , acredito, mas essa mudança é irrelevante para a resposta. A resposta típica é assim:

$ ps -A -ww | grep [f]oobar

Em vez disso, uso esse padrão:

$ ps -A -ww | grep [^]]foobar

A principal vantagem é que é mais fácil escrever scripts baseados nesses padrões, porque você simplesmente concatena uma string estática [^]] com qualquer padrão que esteja procurando. Você não precisa retirar a primeira letra da corda, em seguida, inseri-la entre as chaves quadradas e depois concatená-la novamente. Ao fazer o script no shell, é mais fácil simplesmente colocar [^]] na frente do padrão que você estava procurando. String fatiar em Bash é uma coisa feia, então minha variação evita isso. Esta variação diz mostrar as linhas onde o padrão corresponde SEM um colchete direito à direita]. Como o padrão de pesquisa para excluir um colchete na verdade adiciona o colchete ao padrão, ele nunca se igualará.

Você pode escrever um comando portátil psgrep da seguinte maneira. Aqui, eu faço algumas diferenças entre o Linux, OS X BSD e outros. Isso adiciona os cabeçalhos de coluna de ps , fornece um formato ps mais personalizado que atende às minhas necessidades e exibe processos que listam extra, extra largo para que nenhum dos argumentos da linha de comando seja perdido. Bem, a maioria não é perdida. Java sendo Java, muitas vezes faz as coisas da pior maneira possível, assim você alguns serviços java serão executados após o comprimento máximo permitido de argumentos que a tabela de processos acompanhará. Eu acredito que isso é 1024 caracteres. O comprimento de comando solitário permitido para iniciar um processo é muito maior, mas a tabela de processo do kernel não se preocupa em rastrear qualquer coisa com mais de 1K de comprimento. Uma vez que o comando é iniciado, o nome do comando e a lista de argumentos não são necessários, então o que é armazenado na tabela de processos é apenas informativo.

psgrep ()
{
    pattern=[^]]${1};
    case "$(uname -s)" in
        Darwin)
            ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        Linux)
            ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        *)  # other UNIX flavors get a minimalist version.
            ps -A -ww | grep -i -e ${pattern}
        ;;
    esac
}
    
por 05.03.2016 / 02:49
65

+1 para @jamzed terse answer, no entanto, o OP pode precisar de alguma explicação:

ps | grep "[d]jango"

Usando esse regex, você está iniciando um processo no qual sua string ps não corresponderá, pois o regexp corresponde a "django" e não "[d]jango" . Dessa forma, você excluirá o processo que tem a string "[d] jango", que neste caso é grep; O mesmo pode ser aplicado ao pgrep, egrep, awk, sed, etc ... qualquer comando que você tenha usado para definir o regex.

De man 7 regex

   A bracket expression is a list of characters enclosed in "[]".  It nor‐
   mally matches any single character from the list (but see  below).   If
   the  list  begins  with  '^',  it matches any single character (but see
   below) not from the rest of the list.  If two characters  in  the  list
   are  separated  by '-', this is shorthand for the full range of charac‐
   ters between those two (inclusive) in the collating sequence, for exam‐
   ple,  "[0-9]" in ASCII matches any decimal digit.  It is illegal(!) for
   two ranges to share an endpoint, for example, "a-c-e".  Ranges are very
   collating-sequence-dependent,  and portable programs should avoid rely‐
   ing on them.
    
por 09.03.2012 / 08:54
29

ps | grep [d]jango

ps | grep d[j]ango

...

ps | grep djang[o]

    
por 09.03.2012 / 08:10
17

Use o pgrep em vez disso: pgrep -lf django

    
por 09.03.2012 / 07:19
11

Ah, espere, isso funciona:

ps | grep django | grep -v grep
    
por 09.03.2012 / 06:46
8

ps -d | grep django

do man ps:

 -d                  Lists information  about  all  processes
                     except session leaders.
    
por 23.10.2012 / 16:08