Defina TZ de acordo com o / etc / localtime

3

O link simbólico de /etc/localtime tem esta aparência:

===> ls -l /etc/localtime 
... /etc/localtime -> /usr/share/zoneinfo/Europe/Berlin

Eu preciso dessa informação na variável de ambiente TZ .

Isso funciona:

===> TZ=US/Pacific last reboot| head
reboot   system boot  4.4.0-34-generic Thu Aug 25 02:12   still running
reboot   system boot  4.4.0-34-generic Wed Aug 24 02:14   still running

Mas isso não acontece:

===> TZ=Europe/Berlin last reboot| head
reboot   system boot  4.4.0-34-generic Thu Aug 25 11:12   still running
reboot   system boot  4.4.0-34-generic Wed Aug 24 11:14   still running

Mas isso acontece com (a partir de fuso horário da Wikipédia )

===> TZ=DE last reboot| head
reboot   system boot  4.4.0-34-generic Thu Aug 25 09:12   still running
reboot   system boot  4.4.0-34-generic Wed Aug 24 09:14   still running

Eu pesquiso uma maneira de definir TZ de acordo com o link de /etc/localtime .

Isso deve ser automatizado e funcionar para todos os fusos horários.

last --version: util-linux 2.27.1

===> cat /etc/adjtime
0.0 0 0.0
0
LOCAL

Atualizar

Os registros no banco de dados interno parecem errados:

root     pts/20       127.0.0.1        Thu Aug 25 13:29 - 13:29  (00:00)
modwork_ pts/17       127.0.0.1        Thu Aug 25 10:38 - 11:37  (00:59)
modwork_ pts/18       127.0.0.1        Thu Aug 25 10:05 - 10:19  (00:13)
tguettle tty7         :0               Thu Aug 25 09:12    gone - no logout
reboot   system boot  4.4.0-34-generic Thu Aug 25 11:12   still running
    
por guettli 25.08.2016 / 09:40

2 respostas

3

EUA / Pacífico Qui 25 de agosto 02:12 é Europa / Berlim Qui 25 de agosto 11:12 , como o horário de Berlim é de 9 horas à frente do horário do Pacífico dos EUA

$ TZ=US/Pacific date -d 'Thu Aug 25 02:12' +%s
1472116320
$ TZ=Europe/Berlin date -d 'Thu Aug 25 11:12' +%s
1472116320

Veja as compensações da UTC:

$ TZ=Europe/Berlin date +%z
+0200
$ TZ=US/Pacific date +%z
-0700

Então, seu segundo exemplo funciona . É o terceiro que não funciona .

TZ=DE é inválido como uma definição de zona padrão ( XXX[offset][YYY[dstoffset]] ), pois tem apenas 2 letras e provavelmente não há um arquivo chamado DE em / usr / share / zoneinfo, portanto, a hora padrão é UTC. / p>

$ TZ=DE date +%z
+0000

Se você inicializasse seu sistema às 9:12, horário de Berlim, isto é, no horário 1472109120 unix, isso indicaria que seu relógio estava desligado por duas horas no momento em que a entrada foi adicionada em wtmp .

Essa é uma das primeiras coisas feitas por init quando o sistema é iniciado. Isso normalmente ocorre antes que os serviços de sincronização de horário de rede (que corrigem o relógio) sejam iniciados. Suas outras entradas em correto wtmp sugerem que o relógio foi corrigido no momento em que a primeira pessoa efetuou login.

Se o seu sistema é de inicialização múltipla e um dos outros sistemas é feito pela Microsoft, observe que os sistemas da Microsoft têm um bug / falha na configuração do relógio do hardware para a hora local em vez do UTC por padrão. Portanto, se o sistema operacional do tipo Unix espera que o relógio do hardware esteja em UTC, haverá um conflito, quando você inicializar no sistema operacional da Microsoft, o sistema operacional tentará mudar o relógio do UTC para o horário local e seu sistema operacional Unix. fará o oposto.

De acordo com , parece que não é mais possível consertar os sistemas operacionais da Microsoft, então é necessário contornar isso informando ao sistema operacional Unix que o relógio do hardware está configurado para a hora local como no Windows (e certifique-se de que todos os sistemas operacionais estejam de acordo com o que a hora local significa) (e certifique-se de não desligar ou reinicializar durante uma alteração de horário de verão). Nos sistemas Debian atuais, por exemplo, isso é feito alterando UTC para LOCAL em /etc/adjtime .

Agora, como seu adjtime já contém LOCAL , isso exclui essa hipótese. Outras possibilidades: você tem outro sistema que define o relógio como UTC, ou é um sistema da Microsoft onde a hora local é definida como UTC. Alterar LOCAL para UTC provavelmente resolveria o problema.

De forma mais geral, você deseja que todos os sistemas operacionais do sistema concordem com o relógio do hardware.

    
por 25.08.2016 / 10:34
2

O relógio do hardware está sendo executado no horário local em vez do UTC, portanto, os registros de data e hora de inicialização são armazenados incorretamente. (Isso é indicado pela entrada LOCAL em /etc/adjtime .) last não se ajusta a isso, portanto, os tempos de inicialização exibidos são alterados pela diferença entre o fuso horário e o UTC (duas horas atualmente para Berlim). Acho que não há como consertar isso, a não ser mudar para o UTC para o relógio do seu hardware!

O restante desta resposta não se refere ao seu problema real, mas ainda é relevante ao considerar TZ e /etc/localtime .

Em geral, para usar um valor baseado em arquivo em TZ , você deve prefixar o nome do arquivo com : (consulte tzset(3) para detalhes):

TZ=:Europe/Berlin last reboot|head

Isso funcionará com qualquer nome de arquivo utilizável como um link de /etc/localtime . Se necessário, TZDIR pode ser usado para substituir o local padrão ( /usr/share/zoneinfo ).

(Assumindo que você esteja executando o Linux com glibc ; : depende da implementação como definido pelo POSIX . No Linux, normalmente você pode passar sem : porque ambas as formas de TZ são tentadas.

    
por 25.08.2016 / 09:58

Tags