Em que circunstâncias o pgrep -x falha ao retornar um pid válido?

1

Eu tenho um aplicativo em execução

$ ps -ef | grep hello_world
steve     9607  1816  0 09:11 ?        00:00:00 ./hello_world
steve    10093 21566  0 09:18 pts/4    00:00:00 grep hello_world

Eu posso usar pgrep -f para procurar o pid usando um padrão

$ pgrep -f ./hello_world
9607
$ echo $?
0

$ pgrep -f hello_world
9607
$ echo $?
0

No entanto, se eu usar pgrep -x para procurar uma correspondência de padrões exata , ela não retornará nada

$ pgrep -x ./hello_world
$ echo $?
1

$ pgrep -x hello_world
$ echo $?
1

Verificando o sistema de arquivos /proc para a linha de comando exata, ele retorna o seguinte:

$ cat /proc/9607/cmdline
./hello_world

Por que pgrep -x está falhando para mim?

    
por Steve Lorimer 23.02.2017 / 15:25

2 respostas

3

$ pgrep -x ./hello_world
$ echo $?
1

O motivo pelo qual a primeira expressão não corresponde é porque você está pedindo para o pgrep procurar uma correspondência de nome de processo exata (com o nome do processo sendo hello_world em seu exemplo), mas você fornece ./hello_world como cadeia de pesquisa.

$ pgrep -x hello_world
$ echo $?
1

Por que a segunda pesquisa não funciona para você, não tenho ideia. Ele funciona no Ubuntu 14.04, então ou há algum tipo de erro no seu post, ou há um bug na versão mais recente:

$ ./dd &
[1] 6377
$ pgrep -x dd
6377
    
por 23.02.2017 / 18:32
0

Parece que a implementação do procps de pgrep -x e correspondência de regex está quebrada:

$ /bin/sleep 9& pgrep -x 'sleep'
[1] 8472
8472
$ /bin/sleep 9& pgrep '^sleep$'
[2] 8485
8472
8485
$ 

Da minha leitura da página man, ambos devem retornar null.

Considere pidof .

Existe um caso irritante em que se deseja excluir um script wrapper, neste caso chamado sleep :

#!//bin////bash
echo "Script PID: $$"
/bin/sleep 1&
pgrep -ax sleep

A saída é:

Script PID: 12973                              
12973 //bin////bash ./sleep                    
12974 /bin/sleep 1 
    
por 24.09.2017 / 12:56

Tags