Estoy tratando de capturar el resultado de cola en el modo follow, donde muestra el texto ya que detecta cambios en la longitud del archivo, particularmente útil para seguir archivos de registro a medida que se agregan líneas . Por algún motivo, mi llamada a StandardOutput.Read() está bloqueando hasta que tail.exe finalice por completo.Capturando estándar desde tail -f "follow"
relevante ejemplo de código:
var p = new Process() {
StartInfo = new ProcessStartInfo("tail.exe") {
UseShellExecute = false,
RedirectStandardOutput = true,
Arguments = "-f c:\\test.log"
}
};
p.Start();
// the following thread blocks until the process exits
Task.Factory.StartNew(() => p.StandardOutput.Read());
// main thread wait until child process exits
p.WaitForExit();
También he intentado usar el soporte para el controlador de OutputDataReceived
evento que presenta el mismo comportamiento de bloqueo:
p.OutputDataReceived += (proc, data) => {
if (data != null && data.Data != null) {
Console.WriteLine(data.Data);
}
};
p.BeginOutputReadLine();
tengo un poco más de código por todas partes la llamada a StandardOutput.Read(), pero esto simplifica el ejemplo y aún muestra el comportamiento de bloqueo indeseable. ¿Hay algo más que pueda hacer para permitir que mi código reaccione ante la disponibilidad de datos en la transmisión StandardOutput antes de que salga la aplicación hija?
¿Es esto simplemente una peculiaridad de cómo se ejecuta tail.exe? Estoy usando la versión 2.0 compilada como parte del paquete UnxUtils.
Actualización: esto parece estar al menos parcialmente relacionado con peculiaridades en tail.exe. Agarré el archivo binario del proyecto GnuWin32 como parte del paquete CoreUtils y la versión aumentó a 5.3.0. Si utilizo la opción -f
para seguir sin reintentos, aparece el temido "descriptor de archivo incorrecto" en STDERR (fácil de ignorar) y el proceso finaliza inmediatamente. Si utilizo la opción -F
para incluir reintentos, parece que funciona correctamente después de que ha aparecido el mensaje de descriptor de archivo incorrecto e intenta abrir el archivo por segunda vez.
¿Hay quizás una compilación de win32 más reciente del repositorio de git coreutils que podría probar?
"tail-f" simplemente comprueba el archivo de cada unidades x tiempo y, si es crecido, lee las cosas nuevas. No sé C#, pero me imagino que sería fácil de implementar allí. Puede obtener inspiración del código fuente para una versión de código abierto de cola (como GNU). Puede ser más fácil implementar la funcionalidad que necesita en C# que resolver este problema. – theglauber
¿Ha considerado usar simplemente FileSystemWatcher o Timer y almacenar una posición de secuencia para búsquedas rápidas usando StreamReader en lugar de ejecutar otro ejecutable? – JamieSee