golang爬坑:操作Linux命令

  通常在启动项目服务程序的时候,需要判断该服务是否已经被启动,一般的做法有两种,其一是每次启动后将pid写入文件中,启动的时候读取这个文件,如果里面有数值,就表示服务已启动;另一种是通过shell命令查找:

ps -ef | grep XXX | grep -v grep | awk '{print $2}'

很多语言都可以直接执行这行命令;偏偏go语言不行,因此,我们可以利用go中提供的一些方法实现它(不说了,直接上代码):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
func Pipeline(cmds ...*exec.Cmd) (pipeLineOutput, collectedStandardError []byte, pipeLineError error) {
    if len(cmds) < 1 {
        return nil, nil, nil
    }
 
    var output bytes.Buffer
    var stderr bytes.Buffer
 
    last := len(cmds) - 1
    for i, cmd := range cmds[:last] {
        var err error
        if cmds[i+1].Stdin, err = cmd.StdoutPipe(); err != nil {
            return nil, nil, err
        }
        cmd.Stderr = &stderr
    }
 
    cmds[last].Stdout, cmds[last].Stderr = &output, &stderr
 
    for _, cmd := range cmds {
        if err := cmd.Start(); err != nil {
            return output.Bytes(), stderr.Bytes(), err
        }
    }
 
    for _, cmd := range cmds {
        if err := cmd.Wait(); err != nil {
            return output.Bytes(), stderr.Bytes(), err
        }
    }
 
    return output.Bytes(), stderr.Bytes(), nil
}
 
func ExecPipeLine(cmds ...*exec.Cmd) (string, error) {
    output, stderr, err := Pipeline(cmds...)
    if err != nil {
        return "", err
    }
 
    if len(output) > 0 {
        return string(output), nil
    }
 
    if len(stderr) > 0 {
        return string(stderr), nil
    }
    return "", errors.New("no returns")
}

 接着写一个例子测试:

1
2
3
4
5
6
7
8
9
10
func main() {
    cmds := []*exec.Cmd{
        exec.Command("ps", "-ef"),
        exec.Command("grep", "redis"),
        exec.Command("grep", "-v", "grep"),
        exec.Command("awk", "{print $2}"),
    }
    string, _ := pipeutil.ExecPipeLine()
    fmt.Printf("pids: %v", string)
}

  Bingo!切记,最后一行 awk的参数不能有单引号(‘’)(当时被坑惨了。。。)

 

posted @   ynnnch  阅读(4638)  评论(2编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示