superverisor 管理使用了beego 庫(kù)的程序的一個(gè)坑

今天用 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ò)

F2AEA03B-3A4E-465B-ABF0-E2DD95EA456F.png

因?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ú)法正常返回

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容