博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang使用oracle碰到go/lib/time/zoneinfo.zip: no such file or directory
阅读量:7070 次
发布时间:2019-06-28

本文共 2470 字,大约阅读时间需要 8 分钟。

hot3.png

继前一篇文章之后,开发的功能终于于5-29日晚上线发布。结果版本发布过程中出现了问题,因此记录下来。

过程是线上环境没有提前安装oracle client,导致应用启动失败。就先找了一台虚拟机模拟版本发布,结果导致出现了如下两个问题:

  1. 安装完oracle client后,启动报error while loading shared libraries: libaio.so.1

直接使用命令apt install libaio1就解决了。

  1. 这个问题碰到就比较懵
panic: open /opt/go/lib/time/zoneinfo.zip: no such file or directorygoroutine 1 [running]:github.com/mattn/go-oci8.init.0()	/home/chensl004/Workspace/go/src/github.com/mattn/go-oci8/globals.go:185 +0x25c

按理来说,线上环境不应该依赖开发环境$GOROOT下的东西,就用关键字“go/lib/time/zoneinfo.zip: no such file or directory”百度了一下,找到这样一篇文章,解决方案是将开发环境下的zoneinfo.zip拷贝到相应的运行环境中。

但解决问题过程中,手痒在线上环境部署并运行了一下,在没有拷贝zoneinfo.zip和没有golang环境的情况下,没有任何问题。当时就纳闷了,为什么线上环境可以,而模拟环境不行,觉得根本原因不在于有不有zoneinfo.zip。

然后去看了github.com/mattn/go-oci8/globals.go中报错的代码位置,主要是加载27个时区,列表如下:

// build timeLocations: GMT -12 to 14	timeLocationNames := []string{"Etc/GMT+12", "Pacific/Pago_Pago", // -12 to -11		"Pacific/Honolulu", "Pacific/Gambier", "Pacific/Pitcairn", "America/Phoenix", "America/Costa_Rica", // -10 to -6		"America/Panama", "America/Puerto_Rico", "America/Punta_Arenas", "America/Noronha", "Atlantic/Cape_Verde", // -5 to -1		"GMT",                                                                         // 0		"Africa/Lagos", "Africa/Cairo", "Europe/Moscow", "Asia/Dubai", "Asia/Karachi", // 1 to 5		"Asia/Dhaka", "Asia/Jakarta", "Asia/Shanghai", "Asia/Tokyo", "Australia/Brisbane", // 6 to 10		"Pacific/Noumea", "Asia/Anadyr", "Pacific/Enderbury", "Pacific/Kiritimati", // 11 to 14	}

我挨个在模拟环境查看文件,结果还真的就发现America/Punta_Arenas这个文件在/usr/share/zoneinfo下没有,本机和线上环境都是有的,好奇就去网上搜了一下这个时区有什么特殊的地方。在网上找到一个github的issue,,里面有这样一句话“Since last year, Punta Arenas has a different timezone than Chile”,并且附上了一个链接,里面有这样一段话

Chile's Region of Magallanes moves from -04/-03 to -03 year-round.     Its clocks diverge from America/Santiago starting 2017-05-13 at     23:00, hiving off a new zone America/Punta_Arenas.

大概就是tz发表一个申明,新增了America/Punta_Arenas这样一个时区。查询了相关信息,在ubuntu里面时区是由tzdata生成的,就看了一下模拟环境的/etc/lsb_release

# cat /etc/lsb-release DISTRIB_ID=UbuntuDISTRIB_RELEASE=16.04DISTRIB_CODENAME=xenialDISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"

怀疑是模拟环境没有进行操作系统更新导致时区信息版本过低,没有America/Punta_Arenas这个时区。因此使用apt install tzdata更新了此软件版本,之后成功启动,问题解决。

附上golang加载时区的顺序,主要是代码

1. 加载环境变量ZONEINFO指定的文件或路径2. 查看unix系统的安装路径,默认是/usr/share/zoneinfo3. 查找$GOROOT/lib/time/zoneinfo.zip  # 本次爆出的问题就是这里,转换为编译时指定的$GOROOT,如:open /opt/go/lib/time/zoneinfo.zip: no such file or directory

转载于:https://my.oschina.net/sannychan/blog/3056060

你可能感兴趣的文章
开发网站合集
查看>>
fastcgi配置
查看>>
[转]Java中堆和栈创建对象的区别
查看>>
Android源码浅析(三)——Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机...
查看>>
咪蒙这么火是怎么做到的
查看>>
【★】路由环路大总结!
查看>>
Spring源码学习之:ClassLoader学习(5)-自测
查看>>
awesome-nlp
查看>>
第 102 章 Ntop
查看>>
利用路由器连接别人家的网络
查看>>
超越存储 遇见未来 HP 3PAR StoreServ存储系列更新
查看>>
工信部:中国物联网产业规模已超9300亿元
查看>>
能源革命为太阳能市场打开了多个缺口?
查看>>
拟态防御或助网络安全实现再平衡
查看>>
理解Spark的核心RDD
查看>>
如何安装pandom : 一个针对Linux的真随机数生成器
查看>>
用模板实现 seqlist
查看>>
Mac go delve debug
查看>>
人人都能开发物联网
查看>>
Android开发学习笔记(14):OnTouch、OnClick、OnLongClick、OnFocusChange调用关系
查看>>