在 Golang 中终止以 os/exec 启动的进程
技术问答
184 人阅读
|
0 人回复
|
2023-09-12
|
没有办法Golang 中终止以 os.exec 启动过程?例如(来自)http://golang.org/pkg/os/exec/#example_Cmd_Start),% O, A' I$ w3 w. L6 Z4 ?6 y* I
cmd := exec.Command("sleep","5")err := cmd.Start()if err != nil log.Fatal(err)}log.Printf("Waiting for command to finish...")err = cmd.Wait()log.Printf("Command finished with error: %v",err)( s& ?2 q- U2 l$ g0 T+ U
3 秒后有没有办法提前终止过程?
7 f" m. a* {$ M提前致谢
% z6 M! \- G0 O- U7 n2 Q: i 4 l, K( T5 u6 ~3 e6 u% m
解决方案:
; i$ P" `% g& w2 C 运行并终止一个exec.Process:
2 c3 b, f0 [* J2 E. c5 Z( a7 @9 [, s# T// Start a process:cmd := exec.Command("sleep","5")if err := cmd.Start(); err != nil log.Fatal(err)}// Kill it:if err := cmd.Process.Kill(); err != nil log.Fatal("failed to kill process: ",err)}8 p0 [ d) w# ]# N5 p
exec.Process超时后操作终止:
& ?& s `( Q8 S# T7 q1 fctx,cancel := context.WithTimeout(context.Background(),3 * time.Second)defer cancel()if err := exec.CommandContext(ctx,"sleep","5").Run(); err != nil / This will fail after 3 seconds. The 5 second sleep // will be interrupted.}
# w2 ~! `0 f: [# h 请参阅Go 文档中的这个例子3 e1 V( O: d8 L! \; r
遗产 h" N, K7 P* y8 k
在 Go 1.在7 之前,我们没有这个context包,答案不一样。, B+ i* X9 z4 f; D0 u) J3 t: i
exec.Process使用通道和 goroutine 在超时后运行和终止:
+ B! p' e. {. m3 [[code]// Start a process:cmd := exec.Command("sleep","5")if err := cmd.Start(); err != nil log.Fatal(err)}// Wait for the process to finish or kill it after a timeout (whichever happens first):done := make(chan error,1)go func() done 要么过程结束并收到它的错误(如果有),done或者已经过去了3 秒,程序在完成前终止。 |
|
|
|
|
|