golang exec.Command 后台守护不执行 shell ?

func initGin() {
    // ? 带参数启动
    var port string
    flag.StringVar(&port, "p", "3312", "端口号默认:3312")
    flag.Parse()
    r := gin.Default()
    r.Any("/:name", func(c *gin.Context) {
        gitUpdate(c.Param("name"))
        c.JSON(200, "更新成功")
    })
    r.Run(":" + port)
}

func gitUpdate(name string) {
    buf, _ := ioutil.ReadFile("./config.yaml")
    var conf Conf
    _ = yaml.Unmarshal(buf, &conf)
    for _, value := range conf.Task {
        if name == value.Name {
            cmd := exec.Command("git", "pull")
            cmd.Dir = value.Path
            err := cmd.Run()
            if err != nil {
                fmt.Println(err)
            }

        }
    }
}

我这里是用的cmd.Run();

理论上来说来这里应该会阻塞,运行完毕后,在执行后台的代码。

但是如果我用supervisord 这个后台守护工具运行,程序是运行起来了的,但是这个git 命令感觉没有执行或者说,直接运行到下面的输出语句哪里去了,会直接输出 "更新成功"

但是我独立运行软件,git 又是成功执行的。

所以我有点晕。

是exec.Command(),cmd.Run() 的问题?

还是supervisord 的后台守护的问题?

请问如何处理!

阅读 3.6k
2 个回答

你可以使用 StdoutPipe()

output := exec.Command("ls")
stdout,err:= output.StdoutPipe()

stdout 里面获取 shell 执行返回的 code

code说明
1通用错误,任何错误都可能使用这个退出码。
2shell内建命令使用错误
126命令调用不能执行。
127command not found,找不到命令
128exit参数错误,exit只能以整数作为参数。
128+n信号"n"的致命错误,如kill -9 脚本的PID,则返回137(128+9)。
130用Control-C来结束脚本,用Control-C是信号2的致命错误。

buf, _ := ioutil.ReadFile("./config.yaml") 我这里是路径错误了。。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题