Estou tentando executar isso -
watch "ps aux | grep myShittyProcess"
em uma sessão tmux. Este processo myShittyProcess
também foi iniciado em uma sessão tmux. O ps aux
funciona sem comando watch. Mas assim que o coloco em observação, ele não consegue ser executado. Como fazer isso funcionar?
--editar-
Descobri que redimensionar o tmux para tela inteira faz com que funcione. Algo relacionado ao ps
empacotamento de saída e grep
à impossibilidade de encontrar o contexto empacotado.
Responder1
Conforme mencionado na pergunta, edite eresposta do xzfc, o problema parece estar relacionado à quebra de linha do tmux. Para algo mais próximo de uma substituição imediata de ps aux | grep [q]uote
, se você não precisar de informações do usuário, tente:
$ pgrep -af [q]uote
392 bash -c sleep 5 && echo quote
399 bash -c sleep 5 && echo second quote
$ watch pgrep -af [q]uote
O -a
sinalizador faz com que a saída inclua os argumentos da linha de comando, enquanto -f
permite pesquisar os argumentos da linha de comando, bem como apenas o nome do processo.
Responder2
Correr
watch "COLUMNS= ps aux | grep TheProcessYouWatch"
Explicação: watch
define certas variáveis ambientais adicionais, nomeadamente COLUMNS
e LINES
. Isso pode ser facilmente verificado comparando env | grep COLUMNS
e watch 'env | grep COLUMNS'
.
Quando COLUMNS
é definido, ps
trunca sua saída para tantos caracteres em uma linha, mesmo se a saída for canalizada grep
(ou qualquer outra coisa). ( ps
, Por que você faz isso comigo?). Forçar COLUMNS
o vazio no watch
comando é suficiente para ps
funcionar como OP (e eu) esperado.
A propósito, para evitar watch
que grep
processos façam parte da saída observada, considere adicionar []
assim:
watch "COLUMNS= ps aux | grep [T]heProcessYouWatch"
(Claro, eu recomendo que você pgrep
também se familiarize. Outras respostas serão úteis para isso.)
Responder3
ps
é um utilitário que produz resultados legíveis por humanos e confiar em texto legível por humanos é uma má ideia. Você deve usar pgrep myShittyProcess
em vez de ps aux | grep myShittyProcess
. pgrep
produz uma lista simples de pids e, se você quiser uma saída menos chata, pode passar pgrep
a saída de para ps
:
ps -opid,user,args -p `pgrep myShittyProcess`
Para usar esse one-liner, watch
você deve colocá-lo entre ' '
(not " "
) para evitar a substituição antecipada do comando shell:
watch 'ps -opid,user,args -p `pgrep myShittyProcess`'