Por que é pgrep
necessário? Se podemos usar ps
e grep
juntos, por que precisamos pgrep
? Seria estranho se tivéssemos um comando lsgrep
ou curlgrep
.
Mas uma diferença que notei foi que se iniciarmos primeiro uma sessão tmux com
tmux new -s foo
então
ps aux | grep tmux
não será capaz de encontrar o processo do servidor tmux, mas
pgrep -l tmux
pode. Mas ainda assim, por que não temos um sinalizador ps
para que possamos grep
ver pgrep
o processo do servidor tmux? Quais são as diferenças entre ps
com grep
e pgrep
?
Responder1
O ps
comando possui dois campos que, geralmente, se pesquisa desta forma, o args
e o comm
. A primeira é a string do argumento do programa, delimitada por NUL. O segundo é um “nome” para o programa. Eles são armazenados separadamente e (em vários sistemas operacionais) podemambosser alterado pelo próprio programa, em tempo de execução. Programas como esse tmux
realmente fazem isso.
A saída de ps
énão analisável por máquina. Vários campos podem conterespaço em branco não codificadoo que torna impossível determinar os limites do campo de forma confiável, porque o espaço em branco de comprimento arbitrário étambémo separador de campos. args
e comm
são de fato dois desses campos. A saída de ps
é legível apenas por humanos.
Quando sua grep
saída ps
é, portanto, uma correspondência de padrões com linhas inteiras, sem nenhuma maneira confiável de ancorar esse padrão ao campo específico em questão,excetoeliminando praticamente tudo o que é de alguma utilidade e que você pode estar tentando encontrar por esse método em primeiro lugar.
Por exemplo:
- Com a sua
u
opção para Linuxps
(que está-u
no BSDps
), há umuser
campo que contém nomes de usuários, cujosgrep
padrões de busca por nomes de programas também corresponderão ocasionalmente. - O problema canônico (exemplificado em "Qual é a diferença entre ps -ef | grep WDA e ps -ef | grep [W]DA?","Correspondendo aos nomes dos programas, por que tantos acessos?","Função do segundo grep em `ps | grep -v | grep`", emuitosoutros lugares em outros lugares) é claro que o padrão passado para
grep
corresponde aogrep
próprio processoargs
. - Também pode acontecer que correspondam a strings de ambiente, o que é particularmente comovente, dado o que muitas vezes pode ser encontrado em uma
_
variável de ambiente.
%ps -a -x -e -o sid,comm,args | grep dbus-daemon | cabeça -n 4 25 nosh ciclog dbus-daemon/ (nosh) 25 dbus-daemon dbus-daemon --config-file ./system-wide.conf --nofork --address=unix:path=/run/dbus/system_bus_socket 989 dbus-daemon dbus-daemon --config-file ./per-user.conf --nofork --address=unix:path=/run/user/JdeBP/bus 15107 grep grep dbus-daemon % %clearenv --keep-path \ setenv WIBBLE tmux \ ps -a -x -e -o sid,comm,comando | grep tmux 15107 ps PATH=/usr/local/bin:/usr/bin:/bin WIBBLE=tmux ps -a -x -e -o sid,pid,comm,command %
Dito de outra forma: grep
serve para operar em arquivos de texto compostos por linhas. A tabela de processos não é um arquivo de texto e tratá-la como se fosse um arquivo de texto (traduzindo-a com o ps
comando) perde informações sobre os campos.
A maneira de realizar essa pesquisa é observar a tabela de processos com algo diferente de ps
. No Linux, pode-se olhar diretamente para /proc/${PID}/comm
os arquivos psuedo semelhantes para as strings de argumento, strings de ambiente e assim por diante.
Ou pode-se escrever uma ferramenta que pescaos dados específicos a serem correspondidosda tabela de processos, e isso executa a usinagem de padrões apenas nesse campo. Esta ferramenta não se destina a arquivos de texto, mas sim a tabelas de processos. Pode-se chamá-lo pgrep
.
É claro que, na mão que segura, alguém poderia escrever um ps
cujo resultado seriapodeprocessar com (digamos) awk
, porqueélegível por máquina, codificando espaços em branco vis()
e, assim, fornecendo campos que awk
podem ser reconhecidos corretamente. A desvantagem é que então é menoshumano-legível e não exatamente o que um conformante ps
deveria ser. Eu passo sua saída console-flat-table-viewer
para lê-la. ☺
%controle do sistema ps -p 740 -o sid,comm,args COMANDO SID COMANDO 25 dbus-daemon dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket' % %controle de sistema ps -A -o sid,comm,args,envs,tree | awk '{ if ("dbus-daemon"==$2) imprimir $3; }' dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket' dbus-daemon\040--config-file\040./per-user.conf\040--nofork\040'--address=unix:path=/run/user/JdeBP/bus' /usr/local/bin/dbus-daemon\040--fork\040--print-pid\0405\040--print-address\0407\040--sessão % %controle de sistema ps -A -o sid,comm,args,envs,tree | awk '{ if ("dbus-daemon"==$2) imprimir $3; }' | não visto dbus-daemon --config-file ./system-wide.conf --nofork '--address=unix:path=/run/dbus/system_bus_socket' dbus-daemon --config-file ./per-user.conf --nofork '--address=unix:path=/run/user/JdeBP/bus' /usr/local/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session %
Leitura adicional
ps
.Manual de comandos gerais do NetBSD. 02/12/2016.vis
.Manual de funções da biblioteca NetBSD. 22/04/2017.- Shlomi Noach (01/10/2009). Como NÃO testar se o mysqld está ativo. code.openark.org.
- Greg Wooledge. “O risco de analisar a árvore de processos”.Gerenciamento de processos. Wiki de Greg.
- Jonathan de Boyne Pollard (2015).
clearenv
.guia nosh. Programas. - Jonathan de Boyne Pollard (2015).
setenv
.guia nosh. Programas. - Jonathan de Boyne Pollard (2020).
ps
.guia nosh. Programas. - Jonathan de Boyne Pollard (2020).
list-process-table
.guia nosh. Programas.