【发布时间】:2021-05-29 10:56:15
【问题描述】:
这段代码正常工作,它打印Timeout:
ctx, cancel := context.WithTimeout(context.Background(), 1000 * time.Millisecond)
process := exec.CommandContext(ctx, "sleep", "5")
processOutBytes, err := process.Output()
if ctx.Err() == context.DeadlineExceeded {
fmt.Println("Timeout")
}
但是这个,只是另一个命令,不是。进程可以无限工作!
ctx, cancel := context.WithTimeout(context.Background(), 1000 * time.Millisecond)
process := exec.CommandContext(ctx, "su", "-", "myuser", "-c", "python3 main.py")
processOutBytes, err := process.Output()
if ctx.Err() == context.DeadlineExceeded {
fmt.Println("Timeout")
}
在基于 ubuntu:20.04 的 docker 容器内的 Ubuntu 20.04 上运行。为什么会这样以及如何使第二个代码起作用?
【问题讨论】:
-
您确定没有返回除 context.DeadlineExceeded 以外的错误吗?
-
您确定在上下文超时之前该过程没有完成吗?
-
超时只适用于
su进程,下一个调用的进程会继续运行。 -
彼得,Elias Van Ootegem,是的,当然。例如,如果我在 main.py 中有“while True: pass”,则 process.Output() 将无限工作。