none
Get-Process で取得した内容によってメールを発信したい RRS feed

  • 質問

  • Get-Processを下記のように記述しました。

    Get-Process -ComputerName "ipアドレス" -Name "Prog*"

    結果

    Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName                                                                                                                                        
    -------  ------    -----      ----- -----   ------     -- -----------                                                                                                                                        
        177       7    12712      19668    78            7416 PROG001
        183       7    13036      20128    78            9908 PROG002
        183       8    17964      25116    86            6244 PROG003
        183       7    12236      19328    74           10040 PROG004

    通常、この4つのプロセスが起動しているのが正しいのですが

    そのうち一つでも終了した時に、どのプロセスが終了したかをメールで

    通知したいのですがどのようにすればいいでしょうか?

    よろしくお願いいたします。

    2012年6月13日 1:52

回答

  • ありがとうございました。

    なんとか自己解決しました。

    お手数をお掛けしてすみません。

    こんな風になりました。

    $lst = get-process -name "PROG*" | SELECT-OBJECT NAME

    $ctr=0

    foreach ($value in $lst)
    {
        $PROG001 = "X"
        $PROG002 = "X"
        $PROG003 = "X"
        $PROG004 = "X"

        switch -r ($value)
        {
            "PROG001" { $ctr += 1 }
            "PROG001" { $PROG001 = "O"}
            "PROG002" { $ctr += 1 }
            "PROG002" { $PROG002 = "O"}
            "PROG003" { $ctr += 1 }
            "PROG003" { $PROG003 = "O"}
            "PROG004" { $ctr += 1 }
            "PROG004" { $PROG004 = "O"}
        }  
    }

    if ($ctr -ne 9)
    {
        $date = get-date
        $body = "$date `n"
        $body = $bofdy + "常駐ソフトが終了しました。`n"
        $body = $body + "*******************************************`n"
        $body = $body + "*    停止=X                             *`n"
        $body = $body + "*******************************************`n"
        $body = $body + "B001 ->  " + $PROG001 + "`n"
        $body = $body + "B002 ->  " + $PROG002 + "`n"
        $body = $body + "B003 ->  " + $PROG003 + "`n"
        $body = $body + "B004 ->  " + $PROG004 + "`n"
        $body = $body + "(再起動メニューログインID=99999)"

        send-mailmessage `
            -to "user1@xxx.co.jp" `
            -from "error@xxx.co.jp" `
            -subject "常駐ソフト起動確認" `
            -body $body  `
            -SmtpServer "smtp.xxx.co.jp" `
            -Encoding ([System.Text.Encoding]::Default)
    }

     

    2012年6月13日 6:52

すべての返信

  • プロセスが終了したことを検出したいのでしょうか? それともメールの送信方法を知りたいのでしょうか? この2つは完全に独立していて、1つの質問に収める意義がわかりませんでした。

    PowerShellスクリプトはサービスプロセスのように常に動き続けるのでしょうか? 普通は処理が済んだら終了するものだと思います。(が、それだと4つのプロセスの終了を検出できないので…)

    2012年6月13日 4:20
  • 説明が足りませんでした。

    メールの送信方法は分かりますので、プロセスの終了を検出する方法が分かれば助かります。

    やりたいことは、

    常駐処理が数本動いているのですが、たまにどれかが異常終了してしまいます。

    5分に1回スクリプトを起動して、その時に1つでも起動されていなければ

    異常通知のメールを、運用者に送信したいのです。

    現在は、VBSで検出しているのですが、PowerShellで出来ないものかと。

    スクリプトはタイマープログラムで、5分に1回起動させます。

    vbsで書いたものはこんな感じです。

     strComputer = "."
     Set objWMIService = GetObject("winmgmts:\\" & "server" & "\root\cimv2")
     Set colItems = objWMIService.ExecQuery("Select * from Win32_Process",,48)

     Dim ProcCtr
     Dim Chk_PROG001,Chk_PROG002,Chk_PROG003,Chk_PROG004

     Chk_PROG001="0"
     Chk_PROG002="0"
     Chk_PROG003="0"
     Chk_PROG004="0"

     ProcCtr = 0

     For Each ProcItems In colItems

      Select Case ProcItems.Description

       Case "PROG001.EXE"
        ProcCtr = ProcCtr + 1
        Chk_PROG001="1"
       Case "PROG002.EXE"
        ProcCtr = ProcCtr + 1
        Chk_PROG002="1"
       Case "PROG003.EXE"
        ProcCtr = ProcCtr + 1
        Chk_PROG003="1"
       Case "PROG004.EXE"
        ProcCtr = ProcCtr + 1
        Chk_PROG004="1"

      End Select

     Next

     If ProcCtr <> 4 Then
      Set objEmail = CreateObject("CDO.Message")
      objEmail.From = "error@xxx.co.jp"

      objEmail.To = "user1@xxx.co.jp"

      objEmail.Subject = "☆☆☆プログラム確認要求☆☆☆"
      objEmail.Textbody = "プログラムが1つ以上停止しています" & Chr(13) & "至急確認してください!" & Chr(13) & Chr(13)
      objEmail.Textbody = objEmail.Textbody & "*******************************************" & Chr(13)
      objEmail.Textbody = objEmail.Textbody & "*    起動->1                   停止->0    *" & Chr(13)
      objEmail.Textbody = objEmail.Textbody & "*******************************************" & Chr(13) & Chr(13)
      objEmail.Textbody = objEmail.Textbody & "PROG001 ->" & Chk_PROG001 & Chr(13)
      objEmail.Textbody = objEmail.Textbody & "PROG002 ->" & Chk_PROG002 & Chr(13)
      objEmail.Textbody = objEmail.Textbody & "PROG003 ->" & Chk_PROG003 & Chr(13)
      objEmail.Textbody = objEmail.Textbody & "PROG004 ->" & Chk_PROG004 & Chr(13)

      objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
      objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.xxx.co.jp"
      objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
      objEmail.Configuration.Fields.Update
      objEmail.Send
     End If

    説明不足を補えているでしょうか?

    2012年6月13日 4:56
  • ありがとうございました。

    なんとか自己解決しました。

    お手数をお掛けしてすみません。

    こんな風になりました。

    $lst = get-process -name "PROG*" | SELECT-OBJECT NAME

    $ctr=0

    foreach ($value in $lst)
    {
        $PROG001 = "X"
        $PROG002 = "X"
        $PROG003 = "X"
        $PROG004 = "X"

        switch -r ($value)
        {
            "PROG001" { $ctr += 1 }
            "PROG001" { $PROG001 = "O"}
            "PROG002" { $ctr += 1 }
            "PROG002" { $PROG002 = "O"}
            "PROG003" { $ctr += 1 }
            "PROG003" { $PROG003 = "O"}
            "PROG004" { $ctr += 1 }
            "PROG004" { $PROG004 = "O"}
        }  
    }

    if ($ctr -ne 9)
    {
        $date = get-date
        $body = "$date `n"
        $body = $bofdy + "常駐ソフトが終了しました。`n"
        $body = $body + "*******************************************`n"
        $body = $body + "*    停止=X                             *`n"
        $body = $body + "*******************************************`n"
        $body = $body + "B001 ->  " + $PROG001 + "`n"
        $body = $body + "B002 ->  " + $PROG002 + "`n"
        $body = $body + "B003 ->  " + $PROG003 + "`n"
        $body = $body + "B004 ->  " + $PROG004 + "`n"
        $body = $body + "(再起動メニューログインID=99999)"

        send-mailmessage `
            -to "user1@xxx.co.jp" `
            -from "error@xxx.co.jp" `
            -subject "常駐ソフト起動確認" `
            -body $body  `
            -SmtpServer "smtp.xxx.co.jp" `
            -Encoding ([System.Text.Encoding]::Default)
    }

     

    2012年6月13日 6:52