继前一篇文章之后,开发的功能终于于5-29日晚上线发布。结果版本发布过程中出现了问题,因此记录下来。
过程是线上环境没有提前安装oracle client,导致应用启动失败。就先找了一台虚拟机模拟版本发布,结果导致出现了如下两个问题:
- 安装完oracle client后,启动报error while loading shared libraries: libaio.so.1
直接使用命令apt install libaio1就解决了。
- 这个问题碰到就比较懵
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