Time zone x Linux x Java
Esta semana tive uma desagradável surpresa em meus servidores Linux que rodam aplicações Java. Como todo ano, o Brasil entra em horário de verão e oficialmente até o ano passado era o dia 12 de outubro. Sendo assim, desavisado sobre meu ambiente de produção que está localizado em São Paulo e foi instalado pelos administradores do data-center paulistano e que selecionaram na hora da instalação do sistema operacional o fuso-horário “America/São Paulo” e não “America/Recife” que é a cidade onde a empresa está sediada.
Na segunda-feira a surpresa, todas as lojas pegaram o famoso “horário de verão” então lá fomos nós setar os horários nos servidores mas não basta só isso, afinal quando acabar o horário de verão os servidores iriam atrasar em 1h. Porém tivemos a desgradável surpresa de que a Java Virtual Machine (JVM) ignora a hora do computador. Embora o horário “estivesse” correto a JVM adiantava em 1h, pesquisando descobrimos que a JVM usa o fuso para ajustar o relógio interno e ignora a hora da BIOS/Sistema Operacional.
Primeiro foi necessário setar o fuso do Sistema Operacional de forma correta. Em nosso ambiente de testes que roda CentOS 5.2 e 4.3 resolvemos com o “zic” através do comando:
# zic -l America/Recife
Lembrando que aqui você poderia colocar o seu fuso.
Já em produção temos Redhat 4 EL. Então o “zic” estava nos retornando o erro abaixo:
# zic -l America/Recife
“command line”, line 1: warning: hard link failed, symbolic link used
Então mais um pouco de pesquisa descobri que o Redhat tem um utilitário chamado “dateconfig” para configuração do fuso.
# dateconfig
Selecione seu fuso e dê Ok.
Lembrando que: Para fazer isso em produção pare os serviços da máquina, pois poderá afetar as suas aplicações que utilizam data/hora do servidor.