terça-feira, 9 de novembro de 2010

Como assim não existe uptime no Windows?

Recentemente um artigo do Viva o Linux me chamou a atenção:

Comando uptime no Windows?


Sim, o artigo está correto, o comando uptime no Windows é uma ferramenta do Resource Kit, um pacote de ferramentas de apoio que vejo instalado em 10 de cada 10 servidores Windows bem administrados.


Uptime é provavelmente o modo mais fácil de obter esta informação, mas não é o único. Há tempos escrevi umas linhas sobre as maneiras alternativas de obter esta mesma informação e, embora eles não sejam exatamente o caminho menos complicado, cada um deles revela uma particularidade interessante da arquitetura Windows.
 
Método 1: net statistics server

Sistemas suportados: Windows 2000, Windows XP, Windows 2003, Windows 2008

Onde obter:  Embutido no sistema operacional. Um artigo da Microsoft sobre este comando: http://support.microsoft.com/kb/555737

Basta abrir a linha de comando e digitar:

net statistics server

O resultado na tela será:

C:\>net statistics server
Server Statistics for \\TEST-PC
Statistics since 4/27/2009 8:00 PM
Sessions accepted                  1
Sessions timed-out                 0
Sessions errored-out               0
.
.
.

Para saber o uptime, apenas a segunda linha do resultado nos interessa, pois ele mostra há quanto tempo o serviço SERVER (responsável por compartilhamento de arquivos via SMB) está no ar.

Vantagens: não requer instalação de software, o comando estará disponível em 100% dos sistemas suportados, rápido de executar.

Desvantagens:  só é possível obter o uptime local, e o uptime mostrado é o do serviço SERVER. Se este serviço tiver sido reiniciado há pouco ou não estiver sendo executado, o resultado não será exato.



Método 2: Uptime.exe (sim, nós temos uptime!)

Sistemas suportados: Windows NT 4.0, Windows 2000, Windows XP, Windows 2003, Windows 2008.


É uma ferramenta bem velhinha, do tempo do NT 4.0, mas que acredito que faça parte da mala de truques de muitos sysadmins. O resultado dela é cru:

C:\>uptime
\\TEST-PC has been up for: 2 day(s), 17 hour(s), 12 minute(s), 57 second(s)

Mas a parte divertida desta ferramenta é verificar o uptime em servidores remotos, algo que é muito útil para criar scripts que cuspam o uptime de um grupo de servidores.

Vantagens: verifica o uptime de sistemas remotos, mostra o uptime real, ao contrário do método anterior.

Desvantagens:  não é nativo do sistema operacional, isto é, você vai ter que instalar a cada vez que usar. Recomendo mantë-lo no seu pen drive/CD/DVD de truques para usar a qualquer hora. Apesar de permitir a execução remota, ele necessita de comunicação com o Event Viewer remoto, ou seja, não irá funcionar em servidores atrás de um firewall que barre as portas usadas pelo serviço.


Método 3: Event Viewer, eventos 6008 (crash) e 6009 (shutdown/reboot normal)

Sistemas suportados: Windows NT 4.0, Windows 2000, Windows XP, Windows 2003, Windows 2008.


Eis um “truque” que uso muito: saber exatamente quando o servidor reiniciou pela última vez e se a causa foi uma falha inesperada ou se foi reiniciado manualmente por um administrador é vital no trabalho de qualquer sysadmin. Ao iniciar uma investigação, a primeira coisa que faço é filtrar o event viewer em busca do evento 6008 (reínicio inesperado) ou 6009 (reboot normal).




Figura 1: Event Viewer com filtro para evento 6009.


Note que a fonte deste evento é o serviço eventlog, que é  o serviço responsável pela manutenção dos logs encontrados no event viewer. O evento 6009 é logado sempre que serviço é iniciado após um reboot. O 6008 é logado após um reboot causado por fatores externos (interrupção da energia ou falha severa de hardware) ou após um crash BSOD.


Figura 2: um evento 6008, com a data/hora do reboot inesperado.  Observem a correlação com o evento 6009 correspondente na fig. 1.
 
Note que o evento 6009 não é classificado como um erro (Type: Information), já que o eventlog entende houve um reboot com intervenção manual, mas o 6008 é classificado como um erro e requer atenção.

Vantagens: permite verificar não só o uptime, mas também se o último reboot foi causado por um problema ou se houve intervenção manual.

Desvantagens:  ok, eu menti, este método não mostra diretamente o uptime do sistema, apenas o horário do último reboot. Mas saber a diferença entre um 6009 e um 6008 é tão fundamental que não resisti à tentação de explicar.


Método 4: SystemInfo

Sistemas suportados: Windows 2000, Windows XP, Windows 2003, Windows 2008 (com ressalvas).

Este é o método preferido por quem gosta de linha de comando ou quem precisa de uma saída bem organizada para a informação de uptime. O SystemInfo lista várias informações extremamente úteis sobre o sistema, como a disponibilidade de memória e os hotfixes instalados, mas se você precisa apenas do uptime, simplesmente execute na linha de comando:
                                                                     
systeminfo | find /i "up time"

O resultado será:

C:\>systeminfo | find /i "up time"
System Up Time:            2 Days, 21 Hours, 34 Minutes, 52 Seconds

Curiosamente, no Windows 2008 não existe a informação de uptime na saída do SystemInfo. Utilizando systeminfo | find /i "time" o resultado será o horário do último reboot. 

Vantagens: não requer instalação de software, a saída é limpa, mas o comando pode demorar um pouco a ser executado por inteiro. Adicionando o switch /S ao comando systeminfo, pode-se obter o uptime de sistemas remoto.

Desvantagem: no Windows 2008, a saída mostra apenas o horário do último reboot.


Método 4: Task Manager

Sistemas suportados: Windows 7, Windows 2008

Novidade no Windows 7 e no Windows 2008, o bom e velho Task Manager aprendeu alguns truques novos,  como mostrar a informação de uptime na tab performance:
Figura 3: tab Performance do Taskman com a informação de uptime.
 
Vantagens: obtenha a informação de uptime com dois cliques no mouse.

Estes são os cinco métodos que mais utilizo por aqui. Se você conhece ou usa outros métodos, por favor avise pelos comentários.