Linux启用夏令时,跳变后导致容器日志时间和系统时间相差一小时

日志时间与系统时间相差一小时解决方案
一、 分析
2007年10月分,夏令时曾经做更改,2007年与之前发布的jdk版本均有此问题,2007年后发布的jdk版本不会出现此bug。一线版本jdk为1.5是2004年发布的,通常升级jdk风险太多,所以用以下方法升级时区文件来解决此问题。
已在SUSE Linux Enterprise server 11上测试通过。
参考资料:http://www.oracle.com/cn/technologies/java/tzupdater-readme-136440.html
时区更新下载:http://www.oracle.com/technetwork/java/javase/downloads/tzupdater-download-513681.html
二、 描述
模拟一线的情况成功,与一线的情况相同,在入夏令时和出夏令时会出现时间不能自动调整的问题。
三、 解决步骤
1、修改时区文件
使用root用户更改 /etc/sysconfig/clock
TIMEZONE="Asia/Tehran"
UTC="yes"
DEFAULT_TIMEZONE="Asia/Tehran"
文件描述:TIMEZONE="Asia/Tehran" 表示时区设置为Iran的时区
UTC="yes" 表示启用UTC时间,这样jdk才可以从系统获取正确的时间,必须启用
DEFAULT_TIMEZONE="Asia/Tehran" 默认时区

2、更新jdk时区信息
使用tzupdate.jar 更新jdk的时区信息,注意此时必须要停止所有可能使用jdk的进程,否则会导致升级失败,建议重启系统后升级,保证升级成功
1、下载tzupdate.jar到系统中
2、解压tzupdate.jar
unzip tzupdater-1_3_42-2011k.zip
3、验证版本信息(注意大小写)
java -jar tzupdate.jar –V
如果输出:The Java runtime doesn''t have time zone data (zi directory).
或者
tzupdater version 1.3.42-b02
JRE time zone data version: tzdata2005i
Embedded time zone data version: tzdata2011k
JRE time zone data 的版本是2007以前的,则表示时区信息没有升级到最新,可以继续升级操作

4、升级jdk时区信息
java -jar tzupdate.jar –u
没有任何输出则升级成功
5、测试升级是否成功,无任何输出则升级成功
java -jar tzupdate.jar –t
没有任何输出,则zone data文件验证通过
6、可检查升级后时区版本
java -jar tzupdate.jar –V
输出
tzupdater version 1.3.42-b02
JRE time zone data version: tzdata2011k
Embedded time zone data version: tzdata2011k
则表示升级成功。
3.保证以上步骤没有错误后,调整系统时间,重启操作系统,启动MOS5200系统。检查日志是否与操作系统时间一致。如果时间一致,升级成功。

 

升级碰到的一些问题
1. 升级后验证版本时输出
tzupdater version 1.3.42-b02
JRE time zone data version: tzdata2005i
There's no tzdata available for this Java runtime.
而前面操作没有报错,这是因为你的jdk还有进程在访问,导致升级失败,重启操作系统后执行之前操作就可以升级成功了。
2. 升级后系统时间跟日志时间相差3:30
因为jdk没有获取到正确的时区信息,给jboss的启动文件/opt/netwatcher/pm4h2/app/opt/jboss-report/bin/run.sh中添加启动参数
set JAVA_OPTS=%JAVA_OPTS% -Dprogram.name=%PROGNAME% -Duser.timezone=Asia/Tehran
具体位置加在62行左右,不能再if分支里,保证run.sh一定会执行这句。

重启web容器后就可以获取到正确时区,日志时间会跟随夏令时一起跳变。

3. 测试时输出
The Java runtime doesn''t have time zone data (zi directory).
表示没有升级上去。

你可能感兴趣的:(Java,Linux)