Existe alguma maneira de editar pipes enquanto um processo está sendo executado?

3

Eu às vezes trabalho com processos que:

  • Demora para iniciar
  • Corra por um tempo
  • Registre muitas informações para padronizar

Por exemplo, imagine que este é um grande aplicativo da Web.

Agora, suponha que, por um momento, eu queira apenas ver linhas de saída que contenham foo . Eu acabo fazendo isso:

$ heavy_process
# watch for a bit
# ah, now I just want to see lines that contain 'foo'
# (kill heavy_process)

$ heavy_process | grep foo
# watch for a bit
# ok, I'm statisfied about foo. Let's look at bar instead
# (kill heavy_process)

$ heavy_process | grep bar

É frustrante ter que continuar reiniciando heavy_process quando eu realmente quero mudar o | grep .

Existe uma maneira de "adicionar e remover pipes" de um pipeline na linha de comando?

    
por Nathan Long 21.04.2015 / 15:26

3 respostas

1

Suponho que alguns processos de controle não possam ser evitados. Eu posso pensar em diferentes abordagens. Um correspondente de padrão dinâmico (em vez de grep ), ao longo do núcleo de awk '$0 ~ pat' , em que pat será dinamicamente carregado (por exemplo, com um co-processo% GNUawk). Ou uma solução de injeção de padrão primitivo, em que as diretivas padrão de alteração são inseridas no fluxo de dados para que o filtro awk possa ajustar facilmente o padrão em tempo real, ao longo das linhas:

mkfifo cmdfifo       # create once an asynchroneous communication channel

{ while read cmd < cmdfifo ; do printf "%s\n" "@$cmd" ; done &
  heavy_process ;} |
    awk '
        /^@/ { pat = substr($0,2) ; next }   # parse the injected pattern
        pat !="" && $0 ~ pat     # if pattern is set print matching lines
    '

Para ativar ou alternar a pesquisa para um padrão específico que você usaria, por exemplo,

echo bar > cmdfifo

para ativar uma correspondência para "bar" e uma subsequente

echo foo > cmdfifo

mudará dinamicamente o padrão para "foo".

    
por 21.04.2015 / 16:57
0

Eu acredito que sua sugestão é a melhor solução, com a modificação que você executa o comando em segundo plano:

heavy_process > some_file &

Adicione 2>&1 if heavy_process escreve texto para stderr que você deseja pesquisar. Já que você diz que os programas "registram muitas informações para serem padronizadas", Eu recomendo não usar 2>&1 . O & no final do comando faz com que o processo seja executado de forma assíncrona, o que significa que você pode usar seu terminal para outras coisas enquanto está correndo. Dependendo do shell que você está usando, você provavelmente será notificado quando terminar.

Para pesquisar a saída do processo até agora , tudo que você precisa é

grep foo some_file

Para pesquisar a saída até o momento e continue a monitorar o arquivo enquanto o processo grava nele , use

tail -n +1 -f some_file | grep foo

Sem o -n +1 , tail fornecerá apenas as últimas 10 linhas do arquivo.

    
por 22.04.2015 / 05:29
-2

Você pode escrever um script da seguinte maneira:

#! /bin/bash
while true;
do
        echo -n "Enter your regexp: "
        read myregexp
        heavy_process | grep "$myregexp"
done

Você pode interromper o processo a qualquer momento com Ctrl-c

    
por 21.04.2015 / 16:15