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的参数不能有单引号(‘’)(当时被坑惨了。。。)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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吗?