覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Go言語 - Windows上でのプロセス存在チェック

Windows上のプロセスの存在チェックをしたい場合のサンプルコードです。

前回記事のgo-psを利用すれば十分にチェック可能だと思いますが、今回のサンプルでは tasklist.exe に思いっきり頼っています。


package main

import (
    "bytes"
    "fmt"
    "os"
    "os/exec"
    "syscall"
)

func main() {
    if len(os.Args) < 2 {
        fmt.Printf("Parameter invalid")
        os.Exit(1)
    }
    args := os.Args
    targets := args[1:]
    isRunning, err := isWinProcRunning(targets)

    if err != nil {
        fmt.Printf("Commnand failed.")
        os.Exit(1)
    }

    fmt.Printf("Processes in (%v) any Running? -> %v", targets, isRunning)
}

func isWinProcRunning(names []string) (bool, error) {
    if len(names) == 0 {
        return false, nil
    }

    cmd := exec.Command("tasklist.exe", "/FI", "STATUS eq RUNNING", "/fo", "csv", "/nh")
    cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
    out, err := cmd.Output()
    if err != nil {
        return false, err
    }

    for _, name := range names {
        if bytes.Contains(out, []byte(name)) {
            return true, nil
        }
    }
    return false, nil
}


実行例 1

proccheck.exe chrome.exe
Processes in ([chrome.exe]) any Running? -> true


実行例 2

proccheck.exe chrome.exe RLogin.exe
Processes in ([chrome.exe RLogin.exe]) any Running? -> true


実行例 3

proccheck.exe Dummy1.exe Dumm2.exe Dummy3.exe
Processes in ([Dummy1.exe Dumm2.exe Dummy3.exe]) any Running? -> false


というわけで、tasklist.exe に頼れば、これだけではなく一覧出すことなんかも簡単にできると思います


関連エントリ