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 usandoprctl(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 comreadlink
ou/proc/$pid/exe
. Esse, você não pode mudar sem chamar outroexecve
(embora você possa, em teoria, carregar um novo executável na memória e executar seu código sem chamarexecve
, 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 porargv[0]
.
Também deve ser notado que há muita variação entre os Unices de diferença.