A configuração é que agora tenho duas pastas sob meu diretório atual, busybox-1.36.1
e procps-4.0.4
, e também tenho um serviço languagetool
em execução com DynamicUser=yes
. Agora observe o comportamento diferente:
Legenda: ✅ Não trunca; ❌ trunca.
relógio busybox e busybox ps ✅
./busybox-1.36.1/bin/watch './busybox-1.36.1/bin/ps aux | grep languagetool'
Every 2.0s: ./busybox-1.36.1/bin/ps aux | grep languagetool 2025-03-17 23:20:02
1026972 61534 39:36 java ...languagetool...
4053857 mathiass 0:00 ./busybox-1.36.1/bin/watch ./busybox-1.36.1/bin/ps aux | grep languagetool
4053882 mathiass 0:00 sh -c -- ./busybox-1.36.1/bin/ps aux | grep languagetool
4053884 mathiass 0:00 grep languagetool
busybox watch e procps ps ✅
./busybox-1.36.1/bin/watch './procps-4.0.4/bin/ps aux | grep languagetool'
Every 2.0s: ./procps-4.0.4/bin/ps aux | grep languagetool
languag+ 1026972 0.1 13.6 14468788 4464816 ? Ssl Mar04 39:38 java ...languagetool...
mathias+ 4057218 0.0 0.0 4676 2244 pts/32 S+ 23:35 0:00 ./busybox-1.36.1/bin/watch ./procps-4.0.4/bin/ps aux | grep languagetool
mathias+ 4057222 0.0 0.0 231736 3788 pts/32 S+ 23:35 0:00 sh -c -- ./procps-4.0.4/bin/ps aux | grep languagetool
mathias+ 4057224 0.0 0.0 230732 2520 pts/32 S+ 23:35 0:00 grep languagetool
procps watch e procps ps ❌
./procps-4.0.4/bin/watch './procps-4.0.4/bin/ps aux | grep languagetool'
Every 2.0s: ./procps-4.0.4/bin/ps aux | grep languagetool
mathias+ 4056463 0.0 0.0 230836 3320 pts/32 S+ 23:31 0:00 ./procps-4.0.4/bin/watch ./procps-4.0.4/bin/ps aux | grep languagetool
mathias+ 4056540 0.0 0.0 230836 1532 pts/32 S+ 23:32 0:00 ./procps-4.0.4/bin/watch ./procps-4.0.4/bin/ps aux | grep languagetool
mathias+ 4056541 0.0 0.0 231736 3556 pts/32 S+ 23:32 0:00 sh -c -- ./procps-4.0.4/bin/ps aux | grep languagetool
mathias+ 4056543 0.0 0.0 230732 2244 pts/32 S+ 23:32 0:00 grep languagetool
procps watch e busybox ps ✅
./procps-4.0.4/bin/watch './busybox-1.36.1/bin/ps aux | grep languagetool'
Every 2.0s: ./busybox-1.36.1/bin/ps aux | grep languagetool nixos: Mon Mar 17 23:33:31 2025
1026972 61534 39:38 java ...languagetool...
4056826 mathiass 0:00 ./procps-4.0.4/bin/watch ./busybox-1.36.1/bin/ps aux | grep languagetool
4056831 mathiass 0:00 ./procps-4.0.4/bin/watch ./busybox-1.36.1/bin/ps aux | grep languagetool
4056832 mathiass 0:00 sh -c -- ./busybox-1.36.1/bin/ps aux | grep languagetool
4056834 mathiass 0:00 grep languagetool
Pergunta
Parece estranho que em todos os outros casos os comandos se comportem como eu espero, exceto quando tento usar ambos ps
e watch
from procps
. Alguém sabe o que está acontecendo aqui?
O que parece estar acontecendo é um comportamento que a página do manual do procps discute, embora não esteja no lugar mais óbvio. Na metade ou mais abaixo da página, há uma seção intitulada STANDARD FORMAT SPECIFIERS descrevendo palavras-chave usadas com a
-o
opção. A seção lista em formato de tabela cada palavra especificadora, seu título de cabeçalho e uma descrição das informações que exibe.A opção específica para examinar é "
args
". O campo DESCRIPTIONargs
para é bem longo, mas começa dizendo que a saída é o comando e os argumentos. Mais adiante na descrição, encontramos:O que ele está dizendo é que o procps tenta descobrir a largura da janela do terminal para a qual está enviando. Não importa se você usa
-o args
ou não, o procps sempre faz isso. Quando ele não consegue descobrir a largura - geralmente porque sua saída não está indo diretamente para uma janela do terminal - o procps pode escolher uma largura que você não gosta.Então o truncamento é provavelmente um efeito colateral de canalizar a saída para o
grep
comando. Como o acima indica, adicionandow
às opções procps assim:pode resolver o problema, ou invocá-lo com a
COLUMNS
variável definida para um valor maior como este:pode funcionar melhor.
Normalmente, quando a saída não vai para um terminal,
procps
'ps
não trunca as linhas de comando, mas isso ocorre a menos que a$COLUMNS
variável de ambiente seja definida e aprocps
implementação de awatch
defina com base na largura do terminal em que está sendo executada ¹.Mas aqui, em vez de executar
ps | grep
(aqui usando uma API não padrãops aux
que é realmente ignorada pelo busyboxps
), você poderia simplesmente fazer:(ou
watch -x pgrep -af languagetool
com procps'watch
para evitar invocações desnecessárias do shell).pgrep
, que-f
corresponderá a expressão regular somente à lista completa de argumentos do processo² e não relatará a si mesmo ou sua ancestralidade (como owatch
comando aqui).Observe que, embora
busybox
tenha umpgrep
applet, ele nem sempre está habilitado.Aqui, para corresponder somente na linha de comando sem incluir os comandos
sh
,grep
/awk
ewatch
de forma portátil entre as implementações procps e busybox deps
, você pode fazer:¹ Shells como ksh, zsh, bash ou fish também definem uma variável
$COLUMNS
de shell (não quando não interativa, no caso do bash), mas não a exportam para o ambiente por padrão.² Ou o máximo que for possível obter, já que versões anteriores do kernel Linux disponibilizavam apenas os primeiros 4096 bytes.
³ Juntou-se com espaços e com transformação de alguns caracteres, como os de controle, de forma semelhante ao que
ps -wwo args
faz.