Usuário com melhor resposta
Script que verifique as saidas do tasklist

Pergunta
-
Bom dia, gostaria de saber se vocês conhecem algum script que faça a seguinte leitura:
verifique o status de um serviço, se ele está em execução ou com o status de não responde, ou se o script consegue verificar a saída do tasklist, pois quando digito no prompt tasklist /v, ele me retorna os status de todos os processos, então assim poderia verificar se o processo está em execução ou não respondendo.
para que vocês tenham idéia do que estou procurando segue o cenário:
tenho uma aplicação que roda em um servidor e esta aplicação geralmente costuma travar, mas só vou saber que travou depois de algum tempo e com isso eu perco produção, então gostaria de um script para monitorar justamente isso, se ela está em execução ou como não respondendo assim eu trataria o problema de forma a enviar um e-mai para os analista e finalizaria o processo travado fazendo com que o mesmo seja restartado..
agradeço a vocês
Respostas
-
Olá Mauroserggio,
Eu gerei uma saida do tasklist da seguinte maneira:
tasklist /v /FO "TABLE" > c:\tabela.txt
Depois fiz o script abaixo:
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
'caminho do arquivo txt
nLinha = 0
strTestar = "notepad.exe"
Set objTextFile = objFSO.OpenTextFile("C:\tabela.txt",ForReading)
Do While objTextFile.AtEndOfStream <> True
linha = objTextFile.ReadLine
nlinha = nlinha + 1
strPrograma = TRIM(Mid(linha,1,27))
strStatus = TRIM(Mid(linha,73,15))
if nLinha >= 4 Then
if strPrograma = strTestar Then
if strStatus <> "Executando" Then
Envia_Alerta strPrograma,strStatus
Else
' A LINHA ABAIXO E SOMENTE PARA TESTAR DEPOIS PODE REMOVER
wscript.echo strPrograma & " - " & strStatus
End if
End if
End if
Loop
Sub Envia_Alerta(strServ, strStat)
Set objEmail = CreateObject("CDO.Message")
'COLOQUE AQUI OS ENDEREÇOS DE EMAIL
objEmail.From = "servidor@contoso.msft"
objEmail.To = "jesiel@nwtraders.msft"
objEmail.Subject = "Alerta de Serviço indisponivel "
objEmail.TextBody = "Serviço : " & strServ & " - Status : " & strStat
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
'COLOQUE AQUI O IP DO SERVIDOR DE EMAIL
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "10.0.0.1" '<-informe seu servidor smtp
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update
objEmail.Send
end sub
Faça os testes e poste os resultados.
Até mais,
Jesiel
Obs.: Se útil, classifique- Marcado como Resposta Fábio JrModerator quarta-feira, 21 de novembro de 2012 11:10
-
Tem sim. Mas se for só checar se o processo existe ou não, veja como fica com o Windows PowerShell
$lista = @(get-process | where { $_.processName -eq 'svchost' } )
if($lista.count -gt 0) { 'programa ou código para enviar email aqui' }
Duas linhas. Apenas.
[]s,
Vinicius Canto
MVP Admin Frameworks
http://viniciuscanto.blogspot.com
Vinicius Canto MVP Admin Frameworks Blog: http://viniciuscanto.blogspot.com- Marcado como Resposta Fábio JrModerator quarta-feira, 21 de novembro de 2012 11:10
Todas as Respostas
-
Olá,
Veja se o script abaixo te atende. Ele verifica se um serviço está parado, se tiver manda um email...
No exemplo, estou usando o serviço spooler. Altere para o nome que você desejar.
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colRunningServices = objWMIService.ExecQuery _
("Select * from Win32_Service Where Name = 'Spooler'")
For Each objService in colRunningServices
if objService.State <> "Running" Then
Envia_Alerta "email"
End if
Next
Sub Envia_Alerta(para)
Set objEmail = CreateObject("CDO.Message")
objEmail.From = "emailorigem@dominio.com.br"
objEmail.To = "emaildestino@dominio.com.br"
objEmail.Subject = "ALERTA DE INDISPONIBILIDADE"
objEmail.TextBody = "serviço: " & strServico & " esta indisponivel"
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "10.41.100.5" '<-informe seu servidor smtp
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update
objEmail.Send
end sub
Poste os resultados.
Até mais,
Jesiel
Obs.: Se útil, classifique
-
Olá Josiel, este script me é útil para a verificação de serviços, agradeço, mas a minha prioridade é para processos que estão rodando no gerenciador de tarefas, o problema é que os script que tenho só verificam se o processo está ativo ou não, eles não monitoram o status da tarefa, ou seja, se ela está em execução ou como não respondendo, é este tipo de script que preciso. Ou ainda algum script que consiga ler um arquivo TXT, pq assim eu crio um txt que me indica esta situação e posso trabalhar em cima disso
você conhece algum, desde já agradeço sua atenção -
Olá,
Segue abaixo o script com todos os atributos da classe win32_process:
No exemplo coloquei um processo (notepad), verifique se algum atributo te atende para validar se está executando ou não.
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Process where Name = 'notepad.exe'",,48)
For Each objItem in colItems
WScript.Echo "Caption: " & objItem.Caption
WScript.Echo "CommandLine: " & objItem.CommandLine
WScript.Echo "CreationClassName: " & objItem.CreationClassName
WScript.Echo "CreationDate: " & objItem.CreationDate
WScript.Echo "CSCreationClassName: " & objItem.CSCreationClassName
WScript.Echo "CSName: " & objItem.CSName
WScript.Echo "Description: " & objItem.Description
WScript.Echo "ExecutablePath: " & objItem.ExecutablePath
WScript.Echo "ExecutionState: " & objItem.ExecutionState
WScript.Echo "Handle: " & objItem.Handle
WScript.Echo "HandleCount: " & objItem.HandleCount
WScript.Echo "InstallDate: " & objItem.InstallDate
WScript.Echo "KernelModeTime: " & objItem.KernelModeTime
WScript.Echo "MaximumWorkingSetSize: " & objItem.MaximumWorkingSetSize
WScript.Echo "MinimumWorkingSetSize: " & objItem.MinimumWorkingSetSize
WScript.Echo "Name: " & objItem.Name
WScript.Echo "OSCreationClassName: " & objItem.OSCreationClassName
WScript.Echo "OSName: " & objItem.OSName
WScript.Echo "OtherOperationCount: " & objItem.OtherOperationCount
WScript.Echo "OtherTransferCount: " & objItem.OtherTransferCount
WScript.Echo "PageFaults: " & objItem.PageFaults
WScript.Echo "PageFileUsage: " & objItem.PageFileUsage
WScript.Echo "ParentProcessId: " & objItem.ParentProcessId
WScript.Echo "PeakPageFileUsage: " & objItem.PeakPageFileUsage
WScript.Echo "PeakVirtualSize: " & objItem.PeakVirtualSize
WScript.Echo "PeakWorkingSetSize: " & objItem.PeakWorkingSetSize
WScript.Echo "Priority: " & objItem.Priority
WScript.Echo "PrivatePageCount: " & objItem.PrivatePageCount
WScript.Echo "ProcessId: " & objItem.ProcessId
WScript.Echo "QuotaNonPagedPoolUsage: " & objItem.QuotaNonPagedPoolUsage
WScript.Echo "QuotaPagedPoolUsage: " & objItem.QuotaPagedPoolUsage
WScript.Echo "QuotaPeakNonPagedPoolUsage: " & objItem.QuotaPeakNonPagedPoolUsage
WScript.Echo "QuotaPeakPagedPoolUsage: " & objItem.QuotaPeakPagedPoolUsage
WScript.Echo "ReadOperationCount: " & objItem.ReadOperationCount
WScript.Echo "ReadTransferCount: " & objItem.ReadTransferCount
WScript.Echo "SessionId: " & objItem.SessionId
WScript.Echo "Status: " & objItem.Status
WScript.Echo "TerminationDate: " & objItem.TerminationDate
WScript.Echo "ThreadCount: " & objItem.ThreadCount
WScript.Echo "UserModeTime: " & objItem.UserModeTime
WScript.Echo "VirtualSize: " & objItem.VirtualSize
WScript.Echo "WindowsVersion: " & objItem.WindowsVersion
WScript.Echo "WorkingSetSize: " & objItem.WorkingSetSize
WScript.Echo "WriteOperationCount: " & objItem.WriteOperationCount
WScript.Echo "WriteTransferCount: " & objItem.WriteTransferCount
WScript.Echo ""
Next
Poste os resultados.
Até mais,
Jesiel
Obs.: Se útil, classifique
-
Olá,
a mensagem que a gente vê no agendador de tarefas ("não respondendo") no caso da aplicação travar não existe no WMI como uma propriedade do processo em si. Quem cuida disso é o Window Manager se não me engano, e o WMI não tem controle sobre ele. Sendo assim, você só consegue verificar o status de um serviço ou se um processo está ativo ou não.
Sugiro o seguinte:
1) reescreva a aplicação em questão como um Windows Service. Embora seja possível, não é normal colocar um aplicativo qualquer (não projetado para isso) como um serviço, justamente porque o Service Controller do Windows não vai saber (por exemplo, não vai poder chamar os métodos Service_Start, Service_Restart e Service_Stop) como enviar mensagens para o serviço e, consequentemente, não vai poder controlá-lo corretamente e atualizar o status no WMI e outros lugares.
2) Se reescrever não for uma opção, procure verificar se não é possível analisar pelos contadores do Windows a atividade do processo em questão.
Vinicius Canto
MVP Admin Frameworks
http://viniciuscanto.blogspot.com
Vinicius Canto MVP Admin Frameworks Blog: http://viniciuscanto.blogspot.com -
Vinicius, bom dia
Muito obrigado pela explicação, sendo assim gostaria então de saber se existe a possibilidade de um script ler em um texto uma determinada palavra, e caso ele a encontre seja enviado um alerta, pois dessa forma eu posso monitorar o processo se esta executando ou como não respondendo, usando o tasklist eu consigo criar um txt com essas informações, então se eu conseguir criar um script que verifique uma determinada palavra em um texto consigo resolver meu problema.
agradeço sua atenção -
Olá Mauroserggio,
Eu gerei uma saida do tasklist da seguinte maneira:
tasklist /v /FO "TABLE" > c:\tabela.txt
Depois fiz o script abaixo:
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
'caminho do arquivo txt
nLinha = 0
strTestar = "notepad.exe"
Set objTextFile = objFSO.OpenTextFile("C:\tabela.txt",ForReading)
Do While objTextFile.AtEndOfStream <> True
linha = objTextFile.ReadLine
nlinha = nlinha + 1
strPrograma = TRIM(Mid(linha,1,27))
strStatus = TRIM(Mid(linha,73,15))
if nLinha >= 4 Then
if strPrograma = strTestar Then
if strStatus <> "Executando" Then
Envia_Alerta strPrograma,strStatus
Else
' A LINHA ABAIXO E SOMENTE PARA TESTAR DEPOIS PODE REMOVER
wscript.echo strPrograma & " - " & strStatus
End if
End if
End if
Loop
Sub Envia_Alerta(strServ, strStat)
Set objEmail = CreateObject("CDO.Message")
'COLOQUE AQUI OS ENDEREÇOS DE EMAIL
objEmail.From = "servidor@contoso.msft"
objEmail.To = "jesiel@nwtraders.msft"
objEmail.Subject = "Alerta de Serviço indisponivel "
objEmail.TextBody = "Serviço : " & strServ & " - Status : " & strStat
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
'COLOQUE AQUI O IP DO SERVIDOR DE EMAIL
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "10.0.0.1" '<-informe seu servidor smtp
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update
objEmail.Send
end sub
Faça os testes e poste os resultados.
Até mais,
Jesiel
Obs.: Se útil, classifique- Marcado como Resposta Fábio JrModerator quarta-feira, 21 de novembro de 2012 11:10
-
Tem sim. Mas se for só checar se o processo existe ou não, veja como fica com o Windows PowerShell
$lista = @(get-process | where { $_.processName -eq 'svchost' } )
if($lista.count -gt 0) { 'programa ou código para enviar email aqui' }
Duas linhas. Apenas.
[]s,
Vinicius Canto
MVP Admin Frameworks
http://viniciuscanto.blogspot.com
Vinicius Canto MVP Admin Frameworks Blog: http://viniciuscanto.blogspot.com- Marcado como Resposta Fábio JrModerator quarta-feira, 21 de novembro de 2012 11:10