Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在超时情况下运行命令,并在go中一次读取一行标准输出_Go - Fatal编程技术网

在超时情况下运行命令,并在go中一次读取一行标准输出

在超时情况下运行命令,并在go中一次读取一行标准输出,go,Go,我想运行一个命令并从其stdout打印每一行(当它可用时)。此外,如果命令没有在N秒内完成,我也想终止它 在golang有一些实施超时的例子(特别是)。我在select中有一个time.After()子句,我希望在2秒后命中它,此时RunTraceroute应该返回,但这不会发生 我的代码如下(和在运动场:) 我认为您希望将默认值:案例的主体放入goroutine中;我怀疑这妨碍了你的案件,我同意。它可能是通过select的default子句实现的。您希望您选择的案例被阻止,而不是失败。另外,习

我想运行一个命令并从其
stdout
打印每一行(当它可用时)。此外,如果命令没有在N秒内完成,我也想终止它

在golang有一些实施超时的例子(特别是)。我在
select
中有一个
time.After()
子句,我希望在2秒后命中它,此时
RunTraceroute
应该返回,但这不会发生

我的代码如下(和在运动场:)


我认为您希望将
默认值:
案例的主体放入goroutine中;我怀疑这妨碍了你的
案件,我同意。它可能是通过select的
default
子句实现的。您希望您选择的案例被阻止,而不是失败。另外,习惯用法是在选择的最后一个时间之后去掉
time.After。不确定这是否重要,但有一项命令要求更换箱子。也许这同样适用于某些案例。只需将整个默认子句包装在一个内联的
func
中,在选择之前将其上移,并在其前面加一个前缀
go func()…
如果有输出,如何清除超时,然后再次启动计时器?
package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
    "os/exec"
    "time"
)

func RunTraceroute(host string) {
    errch := make(chan error, 1)
    cmd := exec.Command("/usr/bin/traceroute", host)
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Fatal(err)
    }
    if err := cmd.Start(); err != nil {
        log.Fatal(err)
    }
    go func() {
        errch <- cmd.Wait()
    }()
    select {
    case <-time.After(time.Second * 2):
        log.Println("Timeout hit..")
        return
    case err := <-errch:
        if err != nil {
            log.Println("traceroute failed:", err)
        }
    default:
        for _, char := range "|/-\\" {
            fmt.Printf("\r%s...%c", "Running traceroute", char)
            time.Sleep(100 * time.Millisecond)
        }
        scanner := bufio.NewScanner(stdout)
        fmt.Println("")
        for scanner.Scan() {
            line := scanner.Text()
            log.Println(line)
        }
    }
}

func main() {
    RunTraceroute(os.Args[1])
}
$ go run pipe.go xinhua.com
Running traceroute...\
2016/04/01 11:16:43 traceroute to xinhua.com (58.64.200.76), 30 hops max, 60 byte packets
.......
.......
.....More deleted lines.....

2016/04/01 11:16:49 12  * * *
2016/04/01 11:16:49 13  4.68.63.214 (4.68.63.214)  3.208 ms  3.176 ms  3.241 ms
2016/04/01 11:16:49 14  * * *
2016/04/01 11:16:49 15  if-ae-9-2.tcore1.TV2-Tokyo.as6453.net (180.87.180.18)  160.314 ms  158.837 ms  161.438 ms
2016/04/01 11:16:49 16  if-ae-5-7.tcore1.HK2-Hong-Kong.as6453.net (180.87.112.189)  157.497 ms if-ae-3-2.tcore1.HK2-Hong-Kong.as6453.net (180.87.112.5)  161.397 ms if-ae-5-7.tcore1.HK2-Hong-Kong.as6453.net (180.87.112.189)  159.351 ms
2016/04/01 11:16:49 17  if-ge-10-0-0-1128.core1.undefined.as6453.net (180.87.160.73)  156.412 ms  156.522 ms if-ge-14-0-0-1126.core1.undefined.as6453.net (180.87.112.30)  156.605 ms
2016/04/01 11:16:49 18  * * *
2016/04/01 11:16:49 19  * * *
2016/04/01 11:16:49 20  * * *
2016/04/01 11:16:49 21  113.10.229.113 (113.10.229.113)  165.578 ms  165.818 ms  163.451 ms
2016/04/01 11:16:49 22  113.10.229.74 (113.10.229.74)  163.564 ms ae5.10g-idc.wpc.nwtgigalink.com (113.10.229.66)  162.384 ms 113.10.229.74 (113.10.229.74)  167.026 ms
2016/04/01 11:16:49 23  113.10.230.162 (113.10.230.162)  162.988 ms  162.777 ms  163.807 ms
2016/04/01 11:16:49 24  58.64.160.164 (58.64.160.164)  161.902 ms  162.396 ms  164.986 ms
2016/04/01 11:16:54 25  * * *
2016/04/01 11:16:54 26  58.64.200.76 (58.64.200.76)  162.178 ms !X  162.509 ms !X  162.356 ms !X
package main

import (
    "bufio"
    "fmt"
    "log"
    "os/exec"
    "time"
)

func RunTraceroute(host string) {
    errch := make(chan error, 1)
    cmd := exec.Command("/usr/bin/traceroute", host)

    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Fatal(err)
    }

    if err := cmd.Start(); err != nil {
        log.Fatal(err)
    }

    go func() {
        errch <- cmd.Wait()
    }()

    go func() {
        for _, char := range "|/-\\" {
            fmt.Printf("\r%s...%c", "Running traceroute", char)
            time.Sleep(100 * time.Millisecond)
        }
        scanner := bufio.NewScanner(stdout)
        fmt.Println("")
        for scanner.Scan() {
            line := scanner.Text()
            log.Println(line)
        }
    }()

    select {
    case <-time.After(time.Second * 1):
        log.Println("Timeout hit..")
        return
    case err := <-errch:
        if err != nil {
            log.Println("traceroute failed:", err)
        }
    }
}

func main() {
    RunTraceroute("8.8.8.8")
}