今天用 superverisor 管理一個 使用了beego 庫的 程序出現(xiàn)了一些坑,不用superverisor 管理時正常運行,用了之后進程無法啟動位他。首先聲明一下,這個程序不是完全使用beego 框架 ,只是使用了里面的庫"github.com/astaxie/beego" beego.Run()
先看看superverisor 報啥錯
因為程序會自動執(zhí)行beego 包的init 函數(shù)棱诱,其中執(zhí)行到config 包的init 函數(shù)時出現(xià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 管理時無法獲取 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)
}
}
其實我這個程序本來就不需要beego 自帶的配置文件, 但是由于引用了包迈勋,所以還是執(zhí)行了炬灭,
但是在 os.Getwd() 這里時返回了err 導致panic ,按道理不應該靡菇,我直接運行這個程序沒問題重归,加入到superverisor 管理時就出現(xiàn)了問題,估計是在superverisor 里面運行時無法正確調(diào)用 os.Getwd() 厦凤,沒辦法改了一下beego 的源碼 去掉panic 隨便弄了個workPath = "/tmp" 因為我本來就沒打算用beego 框架的配置文件 只需要返回一個 AppConfig 對象我自己上層應用賦值就行了鼻吮,下面看看 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) //此時返回了err
}
}
.........
在syscall.Getwd() 里面返回了err 较鼓,再看看這個函數(shù)
var useSyscallwd = func(error) bool { return true }
我的天椎木,這里返回的就是true ,搞不懂這個系統(tǒng)包為什么這樣做博烂,難道是go 的一個bug香椎,其實我覺得應該是beego 的一個bug 沒有考慮到用supervisor 這些管理工具 導致有些系統(tǒng)函數(shù)無法正常返回