Я написал SSH-клиент для подключения к сетевым устройствам и установил тайм-аут с помощью «выбрать», когда выполнение команды занимает более 25 секунд. Я заметил, что на некоторых устройствах есть другая IOS, и они не могут сбросить сеанс SSH с ними с помощью метода Close() после того, как истечет время ожидания, и это приведет к утечке goroutinge. Мне нужно поддерживать работу клиента и отключить сеанс, чтобы быть готовым к следующей команде. похоже, что в это время горутина не завершается навсегда! У вас есть идеи?
go func() {
r <- s.Run(cmd)
}()
select {
case err := <-r:
return err
case <-time.After(time.Duration(timeout) * time.Second):
s.Close()
return fmt.Errorf("timeout after %d seconds", timeout)
}
Через профилирование кучи я увидел следующее: 2,77 ГБ 99,44% 99,44% 2,77 ГБ 99,44% bytes.makeSlice
0 0% 99.44% 2.77GB 99.44% bytes.(*Buffer).ReadFrom
0 0% 99.44% 2.77GB 99.44% golang.org/x/crypto/ssh.(*Session).start.func1
0 0% 99.44% 2.77GB 99.44% golang.org/x/crypto/ssh.(*Session).stdout.func1
0 0% 99.44% 2.77GB 99.44% io.Copy
0 0% 99.44% 2.77GB 99.44% io.copyBuffer
0 0% 99.44% 2.78GB 99.93% runtime.goexit
ROUTINE ======================== runtime.goвыйдите в /usr/local/go/src/runtime/asm_amd64.s
0 2.78GB (flat, cum) 99.93% of Total
. . 1993: RET
. . 1994:
. . 1995:// The top-most function running on a goroutine
. . 1996:// returns to goexit+PCQuantum.
. . 1997:TEXT runtime·goexit(SB),NOSPLIT,$0-0
. 2.78GB 1998: BYTE $0x90 // NOP
. . 1999: CALL runtime·goexit1(SB) // does not return
. . 2000: // traceback from goexit1 must hit code range of goexit
. . 2001: BYTE $0x90 // NOP
. . 2002:
. . 2003:TEXT runtime·prefetcht0(SB),NOSPLIT,$0-8
r
? По истечении тайм-аута получатель не может принять результат отs.Run
. Вам все еще может понадобиться убить удаленный процесс; Вы пытались использоватьs.Signal
, чтобы убить его по истечении времени ожидания? - person JimB   schedule 05.05.2016r
? - person JimB   schedule 06.05.2016r
. Вы можете либо буферизовать канал и игнорировать значение, либо получить его снова по истечении тайм-аута. - person JimB   schedule 06.05.2016