Estoy buscando algo que sospecho que no existe: una tubería con nombre sin búfer bloqueada (fifo) para usar desde la línea de comandos. ¿Hay tal cosa?
Este es el caso de uso: supongamos que tengo un proceso que se ejecutará mucho tiempo en segundo plano y arrojará una gran cantidad de resultados stdout
. Realmente no me importa el resultado y no quiero almacenarlo (tal vez no tengo suficiente espacio para hacerlo), pero me gustaría "ingresar" periódicamente y seguir lo que está haciendo, luego abandonarlo nuevamente y deja que haga su trabajo. Por lo tanto, me gustaría redirigir su salida a esta tubería con nombre teóricamente protegida y sin bloqueo y luego aprovecharla periódicamente.
Entonces, básicamente, quiero comenzar así ( 10M
siendo el tamaño del búfer):
mkmagicfifo magicfifo 10M
spewingprocess > magicfifo &
... y visita periódicamente lo que sucede ...
tail -f magicfifo
... sin magicfifo
almacenar toda la salida (por lo tanto, no es un archivo normal), y sin que bloquee el proceso de vomitar cuando se llena y no se toca (por lo tanto, no es una tubería con nombre normal).
No creo que las soluciones involucren tail
o prune
lo hagan (bueno, puedo pensar en una solución alternativa que involucre tail
), porque tail
aún requeriría que almacene todos los datos en algún lugar (si quiero entrar y dejar de mirarlo), y prune
tiene que reescribir el archivo, presumiblemente (admito que no lo he probado / probado) rompiendo la redirección del proceso que genera toda la salida.
Espero poder escribir alguna utilidad para hacer esto, pero * nix tiene muchos aspectos geniales de archivos y tuberías y tal, simplemente no puedo evitar pensar que esto existe y simplemente no lo sé.
Entonces: ¿Existe tal cosa, y si es así, qué es?
fuente
Respuestas:
Creo que lo que estás buscando es GNU
screen
. Mantiene un búfer para mantener la última pantalla llena o dos de salida de uno o más programas y le permite desconectarse y volver más tarde.fuente
tmux
ydtach
, cualquier cosa en la misma clase de aplicación de multiplexor de terminal / administrador de sesión debería ser capaz de lograr lo mismo.Puede usarlo
pv
, proporciona tanta memoria intermedia como desee en una tubería. Puedes usarlo así:Eso le daría hasta 1 GB de almacenamiento intermedio entre
spewingprocess
y los quince. La mayoría de las distribuciones de Linux se ofrecenpv
en un paquete llamado, lo creas o nopv
,.fuente
Yo tuve el mismo problema. Esta es mi primera solución. Primero escriba la salida en un archivo que truncamos después de cada línea para que no crezca indefinidamente:
Luego, lea el archivo usando tail (donde
2> /dev/null
elimina el mensaje de error "file truncated"):De esta manera, el búfer no crece y podemos multiplexar, por ejemplo, ejecutar tantas colas como queramos. Sin embargo, el problema con este enfoque es que podemos perder datos cuando truncamos más rápido de lo que la cola puede leer, como muestra esta prueba:
Después de correr durante un tiempo, la primera y la última línea son:
Pero el archivo tiene menos líneas, por lo que se pierden algunas:
Aún así, esta parece una buena solución si no le importa tanto la pérdida de datos o si su proceso de generación de chispas no es lo suficientemente rápido como para que ocurra la pérdida de datos.
fuente