我試圖在尾隨模式下捕獲尾部輸出,它在其中輸出文本,因爲它檢測文件長度的變化 - 對於添加行後的日誌文件特別有用。出於某種原因,我對StandardOutput.Read()的調用被阻塞,直到tail.exe完全退出。從尾部捕獲標準-f「follow」
相關的代碼示例:
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();
我一直在使用:對於具有相同的阻斷行爲OutputDataReceived
事件處理程序的支持,也嘗試:
p.OutputDataReceived += (proc, data) => {
if (data != null && data.Data != null) {
Console.WriteLine(data.Data);
}
};
p.BeginOutputReadLine();
我身邊有一點點代碼對StandardOutput.Read()的調用,但是這會簡化該示例,並且仍會出現不希望的阻止行爲。是否還有其他事情可以讓我的代碼在子應用程序退出之前響應StandardOutput流中的數據可用性?
這僅僅是tail.exe運行的一個怪癖嗎?我正在使用版本2.0作爲UnxUtils包的一部分進行編譯。
更新:這看起來似乎至少部分與tail.exe中的怪癖有關。作爲CoreUtils軟件包的一部分,我從GnuWin32項目中獲得了二進制文件,版本高達5.3.0。如果我使用-f
選項來關閉而不重試,我會在STDERR上遇到可怕的「壞文件描述符」問題(容易忽略),並且該進程立即終止。如果我使用-F
選項來包含重試,在壞文件描述符消息到來後它似乎能夠正常工作,並且它會嘗試第二次打開該文件。
是否有可能從coreutils git倉庫更新的win32版本我可以試試嗎?
「尾-f」簡單地檢查每x時間單位的文件,如果它是成長,閱讀新的東西。我不知道c#,但我想在那裏很容易實現。您可以從源代碼中獲得開源版本的尾巴(如GNU)的靈感。在C#中實現你需要的功能可能比解決這個問題更容易。 – theglauber
您是否考慮過使用FileSystemWatcher或Timer並存儲流位置以便使用StreamReader進行快速搜索而不是啓動另一個可執行文件? – JamieSee