none
Script que verifique as saidas do tasklist RRS feed

  • 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    
    terça-feira, 24 de março de 2009 12:10

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
    segunda-feira, 30 de março de 2009 16:28
  • 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
    quinta-feira, 2 de abril de 2009 03:53
    Moderador

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
    terça-feira, 24 de março de 2009 13:59
  • 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
    terça-feira, 24 de março de 2009 16:17
  • 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
    terça-feira, 24 de março de 2009 18:05
  • 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
    quinta-feira, 26 de março de 2009 04:18
    Moderador
  • 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
    quinta-feira, 26 de março de 2009 12:05
  • 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
    segunda-feira, 30 de março de 2009 16:28
  • 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
    quinta-feira, 2 de abril de 2009 03:53
    Moderador