チャット ボットで実行されたコマンドからのリアルタイム出力の通信
コマンドを実行できるチャット ボットを設計する場合、出力を抽出して表示します。リアルタイムが極めて重要です。既存の実装が段階的にではなく一度にすべての stdout を返す場合、これは困難になる可能性があります。
既存のアプローチのトラブルシューティング
func runcommand を使用するボットのコードは、実行完了時にすべての標準出力を解放します。リアルタイム出力を実現するために、別のアプローチを検討します。
リアルタイム出力パイプ手法
からの出力を継続的にパイプする手法を紹介します。チャットでコマンドを実行しました。これには以下が含まれます:
出力を継続的に出力する goroutine:
go func() { for scanner.Scan() { fmt.Printf("\t > %s\n", scanner.Text()) } }()
使用した tail コマンドからリアルタイム出力をパイプする例を次に示します。ログ ファイルを監視するには:
この手法を実装すると、ボットは実行されたコマンドの出力をリアルタイムで表示し、チャット アプリケーションのユーザー エクスペリエンスを向上させます。package main import ( "os" "os/exec" "fmt" "bufio" ) func main() { cmd := exec.Command("tail", "-f", "/usr/local/var/log/redis.log") // create a pipe for the output of the script cmdReader, err := cmd.StdoutPipe() if err != nil { fmt.Fprintln(os.Stderr, "Error creating StdoutPipe for Cmd", err) return } scanner := bufio.NewScanner(cmdReader) go func() { for scanner.Scan() { fmt.Printf("\t > %s\n", scanner.Text()) } }() err = cmd.Start() if err != nil { fmt.Fprintln(os.Stderr, "Error starting Cmd", err) return } err = cmd.Wait() if err != nil { fmt.Fprintln(os.Stderr, "Error waiting for Cmd", err) return } }
以上がチャットボットで実行されたコマンドのリアルタイム出力を表示するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。