Leitura adicional

Leitura adicional

Por que é pgrepnecessário? Se podemos usar pse grepjuntos, por que precisamos pgrep? Seria estranho se tivéssemos um comando lsgrepou 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 pspara que possamos grepver pgrepo processo do servidor tmux? Quais são as diferenças entre pscom grepe pgrep?

Responder1

O pscomando possui dois campos que, geralmente, se pesquisa desta forma, o argse 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 tmuxrealmente 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. argse commsão de fato dois desses campos. A saída de psé legível apenas por humanos.

Quando sua grepsaí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:

%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: grepserve 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 pscomando) 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}/commos 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 pscujo resultado seriapodeprocessar com (digamos) awk, porqueélegível por máquina, codificando espaços em branco vis()e, assim, fornecendo campos que awkpodem ser reconhecidos corretamente. A desvantagem é que então é menoshumano-legível e não exatamente o que um conformante psdeveria ser. Eu passo sua saída console-flat-table-viewerpara 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

informação relacionada