在Linux上设置TZ环境变量
在Linux上设置TZ环境变量
v2015.1的更新检查表建议在Linux平台上设置TZ环境变量,并指出了tzset的手册。建议这样做是为了提高Caché的时间相关功能的性能。你可以在下文找到更多关于这个的信息:
我的CentOS 7测试系统上的manpage(RHEL 6也是这样说的)有这样的说法。
"tzset()函数从TZ环境变量初始化tzname变量。 这个函数会被其他依赖时区的时间转换函数自动调用"。
那么,你如何设置TZ?它是如何影响Linux服务器上的时间的?让我们来看看我们能学到什么:
系统时区 --
对于我的测试,我在一个虚拟的CentOS系统上使用Ensemble 2016.1。首先让我们检查一下系统的时区。system-config-date工具可以告诉你。
那么"系统时钟使用UTC "是怎么回事?这指的是服务器的硬件时钟。在专用服务器上,UTC是很常见的。当Linux与Windows进行双启动配置时,情况并非如此(Windows的系统时钟使用本地时间)。
由于双启动配置在Cache'和Ensemble安装中并不常见,我就不多说了。这里的关键思想是,系统时区要设置为服务器的时区,并且硬件时钟时间要设置正确。
用户看见的时间和日期–
让我们看一看。这里是我的终端会话的一个截图:
看起来不错。我的shell进程(运行date命令)和我的Caché进程显示相同的时间,除了我需要输入WRITE命令的几秒钟。
设置 TZ 变量 --
现在让我们在环境中设置TZ。做到这一点的命令是tzselect。下面是一个设置TZ的命令输出的脚本:
[ehemdal@localhost ~]$ tzselect Please identify a location so that time zone rules can be set correctly. Please select a continent or ocean. 1) Africa 2) Americas 3) Antarctica 4) Arctic Ocean 5) Asia 6) Atlantic Ocean 7) Australia 8) Europe 9) Indian Ocean 10) Pacific Ocean 11) none - I want to specify the time zone using the Posix TZ format. #? 2 Please select a country. 1) Anguilla 19) Dominican Republic 37) Peru 2) Antigua & Barbuda 20) Ecuador 38) Puerto Rico 3) Argentina 21) El Salvador 39) St Barthelemy 4) Aruba 22) French Guiana 40) St Kitts & Nevis 5) Bahamas 23) Greenland 41) St Lucia 6) Barbados 24) Grenada 42) St Maarten (Dutch) 7) Belize 25) Guadeloupe 43) St Martin (French) 8) Bolivia 26) Guatemala 44) St Pierre & Miquelon 9) Brazil 27) Guyana 45) St Vincent 10) Canada 28) Haiti 46) Suriname 11) Caribbean NL 29) Honduras 47) Trinidad & Tobago 12) Cayman Islands 30) Jamaica 48) Turks & Caicos Is 13) Chile 31) Martinique 49) United States 14) Colombia 32) Mexico 50) Uruguay 15) Costa Rica 33) Montserrat 51) Venezuela 16) Cuba 34) Nicaragua 52) Virgin Islands (UK) 17) Curacao 35) Panama 53) Virgin Islands (US) 18) Dominica 36) Paraguay #? 49 Please select one of the following time zone regions. 1) Eastern (most areas) 16) Central - ND (Morton rural) 2) Eastern - MI (most areas) 17) Central - ND (Mercer) 3) Eastern - KY (Louisville area) 18) Mountain (most areas) 4) Eastern - KY (Wayne) 19) Mountain - ID (south); OR (east) 5) Eastern - IN (most areas) 20) MST - Arizona (except Navajo) 6) Eastern - IN (Da, Du, K, Mn) 21) Pacific 7) Eastern - IN (Pulaski) 22) Alaska (most areas) 8) Eastern - IN (Crawford) 23) Alaska - Juneau area 9) Eastern - IN (Pike) 24) Alaska - Sitka area 10) Eastern - IN (Switzerland) 25) Alaska - Annette Island 11) Central (most areas) 26) Alaska - Yakutat 12) Central - IN (Perry) 27) Alaska (west) 13) Central - IN (Starke) 28) Aleutian Islands 14) Central - MI (Wisconsin border) 29) Hawaii 15) Central - ND (Oliver) #? 1 The following information has been given: United States Eastern (most areas) Therefore TZ='America/New_York' will be used. Local time is now: Tue May 31 11:21:04 EDT 2016. Universal Time is now: Tue May 31 15:21:04 UTC 2016. Is the above information OK? 1) Yes 2) No #? 1 You can make this change permanent for yourself by appending the line TZ='America/New_York'; export TZ to the file '.profile' in your home directory; then log out and log in again. Here is that TZ value again, this time on standard output so that you can use the /usr/bin/tzselect command in shell scripts: America/New_York [ehemdal@localhost ~]$
文件~/.profile(如果它存在的话)会在你登录时运行,并为你设置TZ变量。如果你使用的是/bin/sh或/bin/bash以外的shell,你可能会使用一个不同的初始化文件。我设置了这个并重新登录。如果你更新一个文件,如/etc/profile,你可以为所有用户应用这个。
这里你可以看到,TZ是为我的用户(ehemdal)设置的,但不是为root用户设置的。
用户看到的TZ,时间和日期–
如果一个用户从不同的时区连接到你的服务器,会发生什么?TZ变量有助于保持用户本地时间的正确性,同时将时区和夏令时的管理权掌握在操作系统手中。这也会影响到Cache'使用的时间。举个例子,我决定把我的时区改为檀香山的时区。
下面是两张截图,显示了结果。
我的用户进程已将时区设置为太平洋/檀香山。Root的进程没有设置TZ(所以使用的是系统时区America/New_York)。在操作系统层面(使用日期命令),显示的是两个用户的当地时间。日期命令反映了用户的本地时间(用户ehemdal为HST,root为EDT)。由于$HOROLOG的值来自于用户进程可用的操作系统时间,所以$H值对两个用户来说是不同的。
我选择檀香山时间作为一个有趣的例子,因为夏威夷不遵守夏令时。 通过为所有用户正确设置TZ,本地时间可以为遵守夏令时的用户 "提前和推迟",而对于不遵守夏令时的用户则保持稳定。