2017-12-10 21 views
0

다중 경로 장치 (/ dev/mapper/mpatha)에서 sg_inq를 호출하려고합니다. sg_inq는 특정 장치에 iScsi 조회를 보내고 일부 데이터를 추출합니다. 나는이처럼 제한 시간 이동의 자신의 exec.commandContext을 사용하고 있습니다 : 공식 가이드exec.CommandContext를 sg_inq sys 명령과 함께 사용하고 timeout이 never를 반환합니다.

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() 

코드 참조 - https://golang.org/pkg/os/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()를 전혀 사용하지 않습니다.