今天用 superverisor 管理一個(gè) 使用了beego 庫(kù)的 程序出現(xiàn)了一些坑,不用superverisor 管理時(shí)正常運(yùn)行,用了之后進(jìn)程無(wú)法啟動(dòng)。首先聲明一下,這個(gè)程序不是完全使用beego 框架 ,只是使用了里面的庫(kù)"github.com/astaxie/beego" beego.Run()
先看看superverisor 報(bào)啥錯(cuò)

因?yàn)槌绦驎?huì)自動(dòng)執(zhí)行beego 包的init 函數(shù),其中執(zhí)行到config 包的init 函數(shù)時(shí)出現(xiàn)了問(wèn)題,先看代碼
beego/config.go
func init() {
BConfig = newBConfig()
var err error
if AppPath, err = filepath.Abs(filepath.Dir(os.Args[0])); err != nil {
panic(err)
}
workPath, err := os.Getwd()
if err != nil {
//panic(err) //supverisor 管理時(shí)無(wú)法獲取 getwd
workPath = "/tmp"
}
appConfigPath = filepath.Join(workPath, "conf", "app.conf")
if !utils.FileExists(appConfigPath) {
appConfigPath = filepath.Join(AppPath, "conf", "app.conf")
if !utils.FileExists(appConfigPath) {
AppConfig = &beegoAppConfig{innerConfig: config.NewFakeConfig()}
return
}
}
if err = parseConfig(appConfigPath); err != nil {
panic(err)
}
}
其實(shí)我這個(gè)程序本來(lái)就不需要beego 自帶的配置文件, 但是由于引用了包,所以還是執(zhí)行了,
但是在 os.Getwd() 這里時(shí)返回了err 導(dǎo)致panic ,按道理不應(yīng)該,我直接運(yùn)行這個(gè)程序沒(méi)問(wèn)題,加入到superverisor 管理時(shí)就出現(xiàn)了問(wèn)題,估計(jì)是在superverisor 里面運(yùn)行時(shí)無(wú)法正確調(diào)用 os.Getwd() ,沒(méi)辦法改了一下beego 的源碼 去掉panic 隨便弄了個(gè)workPath = "/tmp" 因?yàn)槲冶緛?lái)就沒(méi)打算用beego 框架的配置文件 只需要返回一個(gè) AppConfig 對(duì)象我自己上層應(yīng)用賦值就行了,下面看看 os.Getwd() 里面到底是啥,
func Getwd() (dir string, err error) {
if runtime.GOOS == "windows" {
return syscall.Getwd()
}
// Clumsy but widespread kludge:
// if $PWD is set and matches ".", use it.
dot, err := Stat(".")
if err != nil {
return "", err
}
dir = Getenv("PWD")
if len(dir) > 0 && dir[0] == '/' {
d, err := Stat(dir)
if err == nil && SameFile(dot, d) {
return dir, nil
}
}
// If the operating system provides a Getwd call, use it.
// Otherwise, we're trying to find our way back to ".".
if syscall.ImplementsGetwd {
s, e := syscall.Getwd()
if useSyscallwd(e) {
return s, NewSyscallError("getwd", e) //此時(shí)返回了err
}
}
.........
在syscall.Getwd() 里面返回了err ,再看看這個(gè)函數(shù)
var useSyscallwd = func(error) bool { return true }
我的天,這里返回的就是true ,搞不懂這個(gè)系統(tǒng)包為什么這樣做,難道是go 的一個(gè)bug,其實(shí)我覺(jué)得應(yīng)該是beego 的一個(gè)bug 沒(méi)有考慮到用supervisor 這些管理工具 導(dǎo)致有些系統(tǒng)函數(shù)無(wú)法正常返回