Actualmente estoy redirigiendo la salida de una herramienta de monitoreo a un archivo, sin embargo, lo que me gustaría hacer es redirigir esta salida a un nuevo archivo en mi solicitud (usando una combinación de teclas), sin detener dicha herramienta.
Algo como
monitor_program | handle_stdout
Where handle_stdout
me permite definir un nuevo archivo donde colocar el registro en cierto punto.
Sé que podría escribirlo fácilmente, pero me pregunto si hay alguna herramienta que ya lo permita.
bash
pipe
io-redirection
stdout
Treviño
fuente
fuente
logrotate
manualmente un archivo de configuración personalizado, dependiendo del comportamiento de su monitor_programa, pero eso es algo hack.Respuestas:
Sugeriré una pipa con nombre.
Crea una tubería
mkfifo p
(llámalo como quieras, si no es 'p')Cree un script de "lector" que lea desde la tubería y escriba donde quiera
Dígale al programa de monitoreo que escriba sus registros en la tubería nombrada
Aquí hay una secuencia de comandos de lector de muestra que lee de una tubería con nombre 'p' y escribe los datos en un archivo indexado 'mylog':
fuente
read
y enprintf
lugar de solocat <p >> mylog."$INDEX"
?A partir de su idea SIGINT, aquí puede usar SIGQUIT ( Ctrl+\) que aún puede usar Ctrl+Cpara detener todo:
Eso supone
cat
que no está integrado en su caparazón (por lo que se interrumpe al presionar Ctrl+\).Tenga en cuenta que, al igual que en su enfoque, existe la posibilidad de que el SIGQUIT se entregue en el momento equivocado (en la llamada al sistema de escritura) y que se pierdan algunos datos.
fuente
Probablemente podría usar
less
y guardar desde allí escribiendo sluego el nombre del archivo en el que desea guardar Enter. De ¿Cómo escribo todas las líneas de menos a un archivo? .fuente
Sin saber más acerca de su "solicitud" no es realmente posible responder. Si se basara en el tamaño o intervalo del archivo, los rotatelogs (que deberían venir incluidos con Apache httpd) funcionarían.
fuente
Gracias a la respuesta de Jeff Schaller , terminé con algo como esto, que básicamente hace lo que necesito, llamémoslo
reader.sh
:Luego se trata de crear una tubería con nombre
mkfifo p
y usar dos terminales dondemonitor_program > p
y sereader.sh
estén ejecutando. Luego puedo detener al lector para establecer un nuevo registro usando Ctrl+ Ce ingresar un nuevo nombre. Ctrl+ Z, como siempre, entonces para detenerlo y matarlo.fuente