如何在 Go 中优雅关闭子进程

有时我们会遇到这样的需求,在一个主进程中启动另外一个进程,而在 Go 中可以使用 exec 包的 Cmd 来轻松实现这类需求,例如代码:

package main

import (
    "fmt"
    "log"
    "os"
    "os/exec"
    "os/signal"
)

func main() {
    cmd := exec.Cmd{
        Path: "nc",
        Args: []string{"-u", "-l", "8888"},
        Dir:  "/usr/bin",
    }

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

    fmt.Println("Start child process with pid", cmd.Process.Pid)

    c := make(chan os.Signal, 1)
    signal.Notify(c, os.Interrupt)
    s := <-c
    fmt.Println("Got signal:", s)
}

这段代码的含义是: 使用 nc -u -l 8888 来模拟一个常驻进程,然后通过 Go 的 exec.Cmd 来运行它,并且 Go 代码不退出,运行代码:


$ go run main.go

Start child process with pid 35904

输出结果表明我们已经通过 Go 成功调用外部命令,起了一个子进程,其进程号为

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值