Por favor, explique a opção -f no pgrep

5

man pgrep diz o seguinte sobre a opção -f :

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

O que significa dizer que a linha de comando completa é usada?

    
por Geek 23.01.2013 / 20:02

2 respostas

10

Isso significa que sem -f , pgrep apenas procura o regexp fornecido nos nomes dos comandos, enquanto que com -f ele procura em seus argumentos (onde o primeiro argumento ( argv[0] ) não é necessariamente o mesmo que o nome do comando).

$ sleep 2000 &
[1] 15768
$ pgrep 2000
$ pgrep -f 2000
15768

E se fizermos com que argv[0] seja diferente do nome do comando (no Linux, como visto em /proc/$pid/stat ), como ao usar zsh ' ARGV0 :

$ ARGV0=foo sleep 2000 &
[2] 15881
$ ps -fp $!
UID        PID  PPID  C STIME TTY          TIME CMD
chazelas 15881 13126  0 19:55 pts/1    00:00:00 foo 2000
$ ps -o comm= $!
sleep
$ awk '{print $2}' /proc/$!/stat
(sleep)
$ pgrep foo
$ pgrep sleep
15881
$ pgrep -f sleep
$ pgrep -f foo
15881

Existe muita confusão em relação ao nome do processo no Unix e no Linux. Existem 3 atributos de um processo que pode reivindicar o nome do processo:

  • O nome base do executável que foi passado para a última chamada de sistema execve (2) que o processo fez. No Linux, isso é usado para inicializar o nome do processo, conforme relatado por ps ou encontrado em /proc/$pid/stat . No entanto, deve-se notar que no Linux, ele pode ser alterado usando prctl(PR_SET_NAME...) .
  • qualquer caminho para o executável que está atualmente mmap ed para execução no processo e, de preferência, o caminho que foi invocado (para scripts, que seria o caminho fornecido na linha shebang, por exemplo). No Linux, você pode obtê-lo com readlink ou /proc/$pid/exe . Esse, você não pode mudar sem chamar outro execve (embora você possa, em teoria, carregar um novo executável na memória e executar seu código sem chamar execve , veja por exemplo algumas tentativas em um user land execve ).
  • O primeiro argumento passou pela chamada do sistema execve. Por convenção, esse argumento destina-se a dizer ao aplicativo seu nome para que ele saiba como se comportar adequadamente, de modo que muitas vezes é o que se entende pelo nome do processo. No Linux, ele pode ser encontrado em /proc/$pid/cmdline , mas um processo também pode alterá-lo, modificando a memória apontada por argv[0] .

Também deve ser notado que há muita variação entre os Unices de diferença.

    
por 23.01.2013 / 21:02
-3

quando você ps -f verá mais detalhes sobre os processos, incluindo os comandos associados e as informações do processo. Quando você pgrep -f pesquisará essas informações adicionais para corresponder à sua consulta, em oposição ao que é exibido quando você usa apenas ps ou ps -e

    
por 23.01.2013 / 20:07