は、私はそれがファイルの長さの変化を検出すると、それはテキストを出力追従モードで尾からの出力をキャプチャしようとしています「追跡します」 。何らかの理由で、tail.exeが完全に終了するまでStandardOutput.Read()への呼び出しがブロックされています。キャプチャ標準は
関連するコードサンプル:
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実行の癖ですか? UnxUtilsパッケージの一部としてコンパイルされたバージョン2.0を使用しています。
更新:これは少なくとも部分的にtail.exeのクォークに関連しているようです。私はGnuWin32プロジェクトからCoreUtilsパッケージの一部としてバイナリを取得し、バージョンは5.3.0に上がった。私は再試行せずに従うこと-f
オプションを使用する場合、私は(無視しやすい)STDERRの恐ろしい「不正なファイルディスクリプタ」の問題を取得し、プロセスはすぐに終了します。再試行を含めるために-F
オプションを使用すると、不正なファイル記述子メッセージが来て、2回目にファイルを開こうとした後で正常に動作しているようです。
は、おそらく私が試みることができるcoreutils gitリポジトリから、より最近のwin32ビルドありますか?
それはだ場合は、単純に、すべてのX時間単位のファイルをチェックし、「-fテール」あなたはそれを行うことができます
一つの方法は、このようなものです成長し、新しいものを読む。私はC#を知らないが、そこに実装するのは簡単だろうと思う。オープンソース版のtail(GNUなど)のソースコードからインスピレーションを得ることができます。この問題を解決するよりも、C#で必要な機能を実装する方が簡単かもしれません。 – theglauber
FileSystemWatcherまたはTimerを使用して、別の実行可能ファイルを起動する代わりにStreamReaderを使用してクイックシークのストリーム位置を保存するだけでいいですか? – JamieSee