2017-12-10 19 views
0

を返すことはありません。 sg_inqは、特定のデバイスにiScsiの問い合わせを送信し、一部のデータを抽出します。 - https://golang.org/pkg/os/exec/#CommandContextは、私は、マルチパスデバイス(/ mpathaは/ dev /マッパー)にsg_inqを呼び出すようにしようとしている

このコードを返すことはありません

ctx, cancel := context.WithTimeout(context.Background(), 
time.Duration(1000)*time.Millisecond) 
defer cancel() 

cmd := exec.CommandContext(ctx, "sg_inq", "/dev/mapper/mpatha") 
err := cmd.Run() 
cmd.Stdout = &stdout 
cmd.Stderr = &stderr 
stdErr := stderr.Bytes() 
stdOut := stdout.Bytes() 

公式ガイドのコードの参照:私はこのように、タイムアウトのために行くの独自exec.commandContextを使用しています。 スタンドアロンスクリプトとして実行すると、正常に動作します。しかし、私はそれをインターフェイス全体の一部として実行すると、ちょうど立ち往生します。私はすべての呼び出しを「出ている」と見ることができますが、それらのどれも戻ることはありません。

同じコードスニペットは、スタンドアロンスクリプトではなく、全体行くクラスで動作しない理由はありますか?あるいは、私はここから離れているかもしれません。問題はまったく別のものですか? 私は行く1.9.2(最新)の上でそれをコンパイルしていますが、私は同様に1.9.1で試してみました。

ビルドが正常に動作し、テストが合格し、そのすべてが作業する必要があります。

+1

"全体のクラス"のことを少し混乱させるように言及するときは、最小の実例を示してください。 Goにはクラスがありません:) – biosckon

答えて

0

ソリューションは、実際にはかなり簡単でした。 主な問題は、システムコールが常に正しく機能するとは限らないことでした。私はこれらのリンクを使用して、これを研究してきました:

http://www.darrencoxall.com/golang/executing-commands-in-go/
https://github.com/ryankurte/go-async-cmd/blob/master/cmd.go

私はコマンドの出力を読むための唯一の場所はcmd.Wait(前だったことが判明)とcmd.Start後の()。だから私は空のバイト配列を得続けた。 コードが戻った、それはちょうど空だった。私はより多くの見つけた何

- https://medium.com/@vCabbage/go-timeout-commands-with-os-exec-commandcontext-ba0c861ed738

この最後のリンクは、私が遭遇した問題への素晴らしいソリューションを持っています。 cmd.Wait()をまったく使用しません。

関連する問題