跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

Go程序不同启动方式下工作目录差异:如何解决systemctl启动导致os.Getwd()返回根目录的问题?

Linux系统下Go程序工作目录差异及
systemctl
启动问题解决方案 Go程序在Linux系统中,不同的启动方式会影响
os.Getwd()
获取的工作目录,从而引发配置文件读取错误等问题。本文分析
nohup ./main &
systemctl
两种启动方式下
os.Getwd()
返回路径不同的原因,并提供解决方案。 问题: 使用
nohup ./main &
启动Go程序时,
os.Getwd()
能正确返回工作目录,配置文件读取正常。但使用
systemctl
启动时,
os.Getwd()
却返回
/
根目录,导致配置文件读取失败,程序启动异常。 原因: CentOS Linux 7.9.2009 CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。 下载 这源于两种启动方式下程序的工作目录不同:
nohup ./main &
继承启动命令的当前目录,而
systemctl
默认工作目录为
/
。 解决方案: 在
systemctl
的service配置文件中,添加
WorkingDirectory
选项,显式指定Go程序的工作目录。例如,Go程序可执行文件位于
/home/user/myproject/
,则在
systemctl
service文件中添加:
[Service] WorkingDirectory=/home/user/myproject/ # ... 其他配置 ...
通过设置
WorkingDirectory
systemctl
启动的Go程序将拥有正确的工作目录,
os.Getwd()
返回预期路径,从而避免配置文件读取错误,确保程序正常运行。

相关文章