sudo pgrep -f corresponde a cadeias arbitrárias e retorna aumentando pids

2

Durante a depuração de um problema relacionado, notei que o pgrep estava retornando um PID para padrões de linha de comando aparentemente arbitrários, por exemplo:

$ sudo pgrep -f "asdf"
13017

$ sudo pgrep -f ";lkj"
13023

$ sudo pgrep -f "qwer"
13035

$ sudo pgrep -f "poiu"
13046

$ sudo pgrep -f "blahblahblah"
14038

$ sudo pgrep -f "$(pwgen 16 1)"
14219

O mesmo comando sem sudo não retornou nada (como esperado):

$ pgrep -f blahblahblah

Eu tentei enviar o PID para o ps para ver qual era o comando, mas isso não funcionou:

$ sudo pgrep -f blahblahblah | xargs ps -f -p
UID        PID  PPID  C STIME TTY          TIME CMD

Parece que o processo termina muito rapidamente. Então eu tentei usar ps e grep, mas isso não funcionou (ou seja, não houve resultados):

$ sudo ps -e -f | grep [a]sdf

$ sudo ps -e -o command | grep asdf
grep asdf

Eu também notei que, se eu rerançasse o comando com rapidez suficiente, parecia que o PID estava subindo constantemente:

$ for i in $(seq 1 10); do sudo pgrep -f $(pwgen 4 1); done
14072
14075
14078
14081
14084
14087
14090
14093
14096
14099

$ for i in $(seq 1 10); do sudo pgrep -f blahblahblah; done
13071
13073
13075
13077
13079
13081
13083
13085
13087
13089

Como verificação de integridade, tentei usar o find e o grep para pesquisar o diretório proc:

$ sudo find /proc/ -regex '/proc/[0-9]+/cmdline' -exec grep adsfasdf {} \;
Binary file /proc/14113/cmdline matches
Binary file /proc/14114/cmdline matches

$ sudo find /proc/ -regex '/proc/[0-9]+/cmdline' -exec grep adsfasdf {} \;
Binary file /proc/14735/cmdline matches
Binary file /proc/14736/cmdline matches

Mais uma vez, parece que o PID está subindo e que o cmdline corresponde a cadeias arbitrárias.

Eu tentei isso no CentOS 6.7 e no Ubuntu 12.04 com os mesmos resultados. Quando experimentei experiências semelhantes no meu Mac, os testes voltaram negativos - sem processos misteriosos.

O que está acontecendo aqui?

    
por igal 21.09.2016 / 20:41

2 respostas

2

Ele está mostrando o processo sudo , ou seja, o PID é o PID do processo sudo que é o pai do comando pgrep que você está executando colocando após sudo . Como você está pesquisando em toda a linha de comando (por -f ), o processo sudo aparece na saída porque a string (padrão) também faz parte do comando original sudo .

Ao usar o -l e -a (se o seu pgrep suportar), você terá uma ideia melhor.

Teste:

% sudo pgrep -af "asdf"
4560 sudo pgrep -af asdf

% sudo pgrep -lf "asdf"
4562 sudo

% pgrep -af "asdf" 
%
    
por 21.09.2016 / 20:47
3

Ele está encontrando seu comando sudo porque a string que você está procurando com o "-f" também está presente na listagem ps completa do sudo.

Basicamente, quando você executa sudo pgrep -f xyz , você executa

PID1 sudo pgrep -f xyz
PID2 pgrep -f xyz

O comando pgrep encontrará ambos, ignora-se e reporta o PID1 como correspondência.

Naturalmente, os PIDs aumentarão porque há um novo comando sudo toda vez que você executá-lo!

    
por 21.09.2016 / 20:45