私のアプリケーションは、コンソール(から提供されたシェルコマンドのすべての種類で動作しますcurl
、date
、ping
、何でも)。次に、を使用して、インタラクティブなシェルコマンド(mongoシェルなど)でケースをカバーしますos/exec
。
たとえば、最初のステップとして、mongodbに接続します。 mongo --quiet --host=localhost blog
次に、任意の数のコマンドを実行し、すべてのステップで結果を取得しますdb.getCollection('posts').find({status:'INACTIVE'})
その後 exit
以下を試しましたが、mongo接続ごとに1つのコマンドしか実行できません。
func main() {
cmd := exec.Command("sh", "-c", "mongo --quiet --host=localhost blog")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
stdin, _ := cmd.StdinPipe()
go func() {
defer stdin.Close()
io.WriteString(stdin, "db.getCollection('posts').find({status:'INACTIVE'}).itcount()")
// fails, if I'll do one more here
}()
cmd.Run()
cmd.Wait()
}
複数のコマンドを実行して、実行されたコマンドごとに標準出力結果を取得する方法はありますか?
Flimzyが指摘したように、mongoを使用するには、絶対にmongoドライバーを使用する必要があります。shellexecを介してそれと対話しようとしないでください。
ただし、根本的な質問に答えるために、もちろん複数のコマンドを実行できます-できない理由はありません。プロセスの標準入力に書き込むたびに、端末に入力しているようです。TTYに接続されているかどうかを明確に検出するプロセス以外は、秘密の制限はありません。
ただし、コードにはいくつかの問題がありos/exec
ます。パッケージのドキュメントを必ず確認してください。あなたはを呼んcmd.Run
でいます、それは:
指定されたコマンドを開始し、完了するまで待機します。
そしてを呼び出すとcmd.Wait
、...もコマンドが完了するのを待ちます。これは非常にシリアル化されたプロセスですが、ゴルーチンでstdinパイプに書き込んでいます。パイプに書き込んでコマンドを実行し、結果を取得し、別のコマンドを書き込み、別の結果を取得します...同時実行のみが混乱します。問題なので、ここでは使用しないでください。そして、あなたはコマンドを書き終えたことをモンゴに伝えるために改行を送信していません(シェルで行うのと同じように-モンゴは閉じ括弧に入るとすぐに実行を開始しないので、エンターを押す必要があります) 。
あなたが標準入力/標準出力を介してプロセスと対話するためにしたいと思う(再び、ことを指摘し、これは絶対にデータベースと対話するための方法ではありませんが、可能性があり、他の外部コマンドに対して有効です):
cmd := exec.Command("sh", "-c", "mongo --quiet --host=localhost blog")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
stdin, _ := cmd.StdinPipe()
// Start command but don't wait for it to exit (yet) so we can interact with it
cmd.Start()
// Newlines, like hitting enter in a terminal, tell Mongo you're done writing a command
io.WriteString(stdin, "db.getCollection('posts').find({status:'INACTIVE'}).itcount()\n")
io.WriteString(stdin, "db.getCollection('posts').find({status:'ACTIVE'}).itcount()\n")
// Quit tells it you're done interacting with it, otherwise it won't exit
io.WriteString(stdin, "quit()\n")
stdin.Close()
// Lastly, wait for the process to exit
cmd.Wait()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加