¿Hay alguna forma de editar las tuberías mientras se está ejecutando un process?

A veces trabajo con processs que:

  • Tardan en iniciarse
  • Corre por un time
  • Registre una gran cantidad de información para la salida estándar

Por ejemplo, imagine que esta es una aplicación web grande.

Ahora supongamos que, por un momento, solo quiero ver líneas de salida que contengan foo . Termino haciendo esto:

 $ 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 

Es frustrante tener que seguir reiniciando heavy_process cuando realmente solo quiero cambiar el | grep | grep .

¿Hay alguna manera de "agregar y eliminar tuberías" de una tubería en la línea de command?

Related of "¿Hay alguna forma de editar las tuberías mientras se está ejecutando un process?"

Supongo que no se puede evitar un process de control . Puedo pensar en diferentes enfoques. O bien un patrón de coincidencia dinámica (en lugar de grep ), a lo largo del núcleo de awk '$0 ~ pat' , donde pat cargará dinámicamente (por ejemplo, a través de un process awk GNU). O una solución de inyección de patrón primitivo, donde las directivas de patrón de cambio se insertan en la secuencia de datos para que el filter awk pueda ajustar fácilmente el patrón sobre la marcha, a lo largo de las líneas de:

 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 activar o cambiar la búsqueda de un patrón específico que luego usaría, por ejemplo,

 echo bar > cmdfifo 

para activar una coincidencia para "barra", y una subsiguiente

 echo foo > cmdfifo 

cambiará dinámicamente el patrón a "foo".

Creo que su propia sugerencia es la mejor solución, con la modificación de que ejecuta el command en segundo plano:

 heavy_process > some_file & 

Agregue 2>&1 si heavy_process escribe text en stderr que desea que pueda search. Como dice que los progtwigs "Registran mucha información para salir de forma estándar", recomiendo no usar 2>&1 . El & al final del command hace que el process se ejecute de forma asincrónica, lo que significa que puede usar su terminal para otras cosas mientras se está ejecutando. Dependiendo de qué shell está utilizando, probablemente recibirá una notificación cuando finalice.

Para search hasta el momento el resultado del process, todo lo que necesita es

 grep foo some_file 

Para search en el resultado hasta el momento y continuar monitoreando el file a medida que el process le escribe , use

 tail -n +1 -f some_file | grep foo 

Sin -n +1 , tail solo te dará las últimas 10 líneas del file.

Podrías escribir un script como el siguiente:

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

Puede interrumpir el process en cualquier momento con Ctrl-c