当前位置: 首页 > Linux

在linux上运行go项目报错:copy_file_range-badfiledescriptor

时间:2023-04-06 03:20:29 Linux

这两天在linux环境下部署go项目时遇到报错:copy_file_range:badfiledescriptor。花了两天时间在网上找了各种方法,折腾了好久才解决。感觉把过程记录下来是很有必要的。1、问题复现安装Go,配置Go环境,使用Beego框架运行Go项目,报如下错误:期间网上搜索卸载重装Go,修改代码没有帮助。Go版本运行项目成功,解决了这个问题。二、解决方法1、Linux环境下卸载Go。先执行goenv查看GOROOT。我的GOROOT=/usr/local/go,进入/usr/local,删除go文件夹。执行以下命令(因为我是在超级管理员下操作,所以不需要在命令开头加sudo)rm-rf/usr/local/go删除软链接:rm/usr/bin/转到/usr/bin/gofmt2。Linux环境下安装Go,首先使用wget下载Go安装包(由于项目需要,我下载的是arm架构下的Go版本),附上一个Go安装包下载地址:Go下载-Go语言中文网-Golang中文社区(studygolang.com)wgethttps://studygolang.com/dl/golang/go1.14.12.linux-arm64.tar.gz解压安装包:tar-xzfgo1.14.12.linux-arm64.tar.gz-C/usr/local创建软链接:ln-s/usr/local/go/bin/*/usr/bin/查看Go版本:goversion3。搭建Go开发环境,在合适的位置创建工作区和子目录。例子如下:mkdir-p$HOME/go/srcmkdir-p$HOME/go/pkgmkdir-p$HOME/go/bin因为我之前的文件夹里有pkg和bin两个文件夹,只有src文件夹创建完毕,如下图:4.配置环境变量使用vi编辑环境变量配置文件$HOME/.bashrc:vim$HOME/.bashrc进入编辑页面按i移动到代码末尾,插入如下内容:exportGOROOT=/usr/local/go#设置为go安装的路径,有些安装包会自动设置默认的gorootexportGOPATH=$HOME/go#Golang项目的默认工作空间exportGOBIN=$GOPATH/bin#goinstall命令生成的可执行文件的路径exportPATH=$PATH:$GOROOT/bin:$GOBIN后,按Esc键,输入:wq保存退出。使配置文件生效:source$HOME/.bashrc可以运行goenv查看Go环境变量:goenv下图是我配置的Go环境变量,主要注意红线的三个配置:5.安装Beego执行命令:gogetgithub.com/astaxie/beego安装bee工具执行命令:gogetgithub.com/beego/bee通常安装成功,但不排除像我这样的特殊情况.此时试试这行命令:goget-ugithub.com/beego/bee神奇的发现安装成功了。这里也可能遇到超时问题,可以参考我的文章:goproxy模块代理解决超时问题。进入项目目录,然后运行:beerun发现项目运行成功:3.原因授人以鱼不如授人以渔。找到成功的解决方案当然是建立在找到问题原因的基础上。经过一番研究,发现是因为我之前安装的Go版本是1.15.5,而在这篇文章中,Go1.15有几个值得关注的变化|TonyBai提到:我的理解是:Go1.11-GoVersion1.14应该需要这个go.mod文件来运行Go项目。Go1.15版本在环境变量中是通过这个实现的:因为项目是在Go1.15之前的版本下开发的,/pkg/mod下可能没有需要的文件,所以项目无法运行,不知道是不是我的理解正确吗?这是一个耻辱。下图中可以看到Go1.14中的环境变量,但是没有GOMODCACHE项。4.感谢golangbadfiledescriptor_benben的博客-CSDN博客:这篇文章的方法不适用于我的问题,不过还是要感谢作者写这篇文章。linux下Go的安装/卸载和重装:这篇文章的卸载Go的方法很有用。Linux下Go的安装、配置、升级和卸载:这篇文章的安装和卸载方法很有用。linux下安装golang和beego框架:这篇文章安装beego和beetools的方法很有用。Go1.15中值得关注的几个变化|TonyBai:本文发现问题:是Go版本不同导致的。