You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中如何向os.exec.Cmd进程发送SIGTERM而非SIGKILL实现优雅终止

解决方案

Golang 的 os.Process 内置了 Signal 方法,可用于向指定进程发送自定义系统信号,你可以用该方法发送 syscall.SIGTERM 实现优雅终止,替代默认发送 SIGKILL 的 Kill() 方法。

代码实现

修改你原有的终止逻辑即可,示例代码如下:

import (
    "log"
    "os/exec"
    "syscall"
    "time"
)

cmd := exec.Command("nc", "example.com", "80")
if err := cmd.Start(); err != nil {
   log.Print(err)
}

exitChan := make(chan error, 1)
go func() {
  exitChan <- cmd.Wait()
}()

// 发送SIGTERM信号触发优雅终止
if err := cmd.Process.Signal(syscall.SIGTERM); err != nil {
    log.Printf("发送SIGTERM失败: %v", err)
    _ = cmd.Process.Kill()
}

// 可选:增加超时逻辑,长时间未优雅退出则强制杀死
select {
case <-exitChan:
    log.Println("进程已完成收尾正常退出")
case <-time.After(5 * time.Second):
    log.Println("进程优雅终止超时,强制结束")
    _ = cmd.Process.Kill()
}

注意事项

  • 该方案仅适用于类Unix系统(包含你使用的Ubuntu、以及其他Linux发行版、macOS等),Windows系统不支持SIGTERM信号,跨平台场景需要单独适配Windows进程终止逻辑。
  • 目标进程需要自身实现了SIGTERM信号的处理逻辑才会执行优雅收尾,如果进程没有做信号处理,收到SIGTERM后默认行为也是直接退出。
  • 原生Kill()方法本质就是Signal(syscall.SIGKILL)的封装,你可以根据业务需要通过Signal方法发送任意POSIX标准信号。

内容的提问来源于stack exchange,提问作者Evyatar Saias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 09:06:02