pgrep correspondência completa não funciona, apenas parte, por quê?

2

Eu uso o pgrep do procps-3.3.10.

Se eu tiver o executável aout_abcdefgh_ver27 , então

pgrep aout_abcdefgh_ver27

não retorna nada, enquanto ps aux | grep aout_abcdefgh_ver27 retorna o resultado esperado:

ps aux | grep aout_abcdefgh_ver27 
evgeniy  14806  0.0  0.0   4016   672 pts/8    S    12:50   0:00 ./aout_abcdefgh_ver27
evgeniy  15241  0.0  0.0  12596  2264 pts/8    S+   12:50   0:00 grep --colour=auto aout_abcdefgh_ver27

Mas se eu correr

$ pgrep aout_abcdefgh_v
14806

pgrep retorna o que eu espero, então eu me pergunto por que funciona de uma maneira tão estranha, talvez eu deva usar alguma opção para o pgrep funcionar com nome completo do processo?

Parece que tem um limite muito curto para o padrão, algo como ~ 10 símbolos.

    
por fghj 02.03.2016 / 10:33

1 resposta

6

O problema é que, por padrão, pgrep procura apenas o processo nome . O nome é uma versão truncada do comando inteiro. Você pode ver qual é o nome, observando /proc/PID/status , em que PID é o ID do processo relevante. Por exemplo:

$ ./aout_abcdefgh_ver27 &
[1] 14255                    ## this is the PID
$ grep Name /proc/14255/status
Name:   aout_abcdefgh_v

Então, sim, pgrep sem flags apenas lê os 15 primeiros caracteres do nome do executável. Para pesquisar a linha de comando completa usada para iniciá-lo, você precisa do sinalizador -f (de man pgrep ):

-f, --full
     The pattern is normally only matched against the process name.  
     When -f is set, the full command line is used.

Então, se você usa -f :

$ pgrep -f aout_abcdefgh_ver27 
14255
    
por 02.03.2016 / 11:21