关于使用chroot导致程序不能获取时区的问题

之前遇到一个很奇怪的问题,就是程序更新之后所记录的日志中时间突然不对了。仔细的检查了日志文件后发现程序启动时所记录的时间是正确的 +8 时区时间,但是进入事件处理循环之后所记录的时间变成了 UTC 时间。

经过一个无比痛苦和纠结的反复检查过程之后,终于发现问题是由于程序中新增的 chroot 调用导致的。

chroot是在unix系统的一个操作,针对正在运作的软件进程和它的子进程,改变它外显的根目录。一个运行在这个环境下,经由chroot设置根目录的程序,它不能够对这个指定根目录之外的文件进行访问动作,不能读取,也不能更改它的内容。

通过 chroot 并降低程序的运行时权限,能够增强程序的安全性,以降低可能出现的漏洞所造成的危害。

chroot 之后,程序无法再访问 /etc/timezone 文件。而程序中调用的时间函数需要访问这个文件来获取时区信息。因此在调用了 chroot 之后,程序所记录的所有时间信息都变成了 UTC 时间。

解决方法也比较简单,就是在程序中手动设置 TZ 环境变量,这样时间函数可以从环境变量当中来获取到时区信息。

此外,在使用 chroot 的测试过程中还发现,调用 chroot 之后,如果在打开文件的时候传入相对路径,程序依然能够读取自身目录下的文件。这可能是预期的设计意图,不过这导致在向文件操作函数传入路径参数时必须作额外的检查。

相关文章
没有评论

留下评论

电子邮件地址不会被公开。 必填项已用*标注