ホームページ > バックエンド開発 > Golang > リアルタイム コマンド出力を親プロセスとログ ファイルにストリーミングするにはどうすればよいですか?

リアルタイム コマンド出力を親プロセスとログ ファイルにストリーミングするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-15 07:26:13
オリジナル
807 人が閲覧しました

How to Stream Real-time Command Output to Parent Process and Log File?

コマンドのストリーミング: 進行状況をリアルタイムで出力

このシナリオでは、実行されたコマンドの出力を親プロセスとログの両方にストリーミングすることを目的としています。ファイル。ただし、標準の cmd.StdoutPipe は最終結果を文字列として返すため、長時間実行プロセスの制限となります。

ソリューションの探索

exec.Command を利用する提供されたコードStdoutPipe および bufio.NewScanner は意図したとおりに機能します。子プロセスの出力を効果的にストリーミングし、コンソールに出力してリアルタイムでログに記録します。子プロセスのライブ出力は、発生時にキャプチャされ、表示されます。

トラブルシューティングのヒント

コードが機能しない場合は、次の理由を考慮してください。

  • 欠落している改行: bufio.NewScanner は行全体を読み取り、改行が見つかった場合にのみデータを返します。改行文字。コマンドが改行を出力しない場合、出力はすぐにストリーミングされない可能性があります。
  • コマンド出力バッファ: プロセスには、stdout および stderr のデフォルトのバッファ サイズがあります。バッファがいっぱいで読み取れない場合、書き込みのブロックにより子プロセスがハングする可能性があります。したがって、この問題を回避するには、常に stdout と stderr の両方を読んでください。

考えられる回避策

コマンドが改行を出力しない場合は、出力をストリーミングする別の方法があります。

  • 単語ごとに読む: スキャナー分割機能を次のように設定します。行ではなく個々の単語を読み取る bufio.ScanWords。
  • 文字ごとに読み取る: 文字を 1 つずつ読み取るには、スキャナ分割機能を bufio.ScanRunes に設定します。
  • 手動読み取り: stdout をバイトごと、またはルーンごとに読み取り、 UTF-8 エンコーディングは正しく処理されます。

子プロセスがデフォルトの stdout ストリームと stderr ストリームに書き込む場合、それらは明示的に読み込まれない限り破棄されることに留意することが重要です。これらのストリームを読み取ることで、子プロセスが通常これらのストリームに出力しない場合でも、出力やエラー メッセージを見逃すことがなくなります。

以上がリアルタイム コマンド出力を親プロセスとログ ファイルにストリーミングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート