shirou/gopsutil: psutil for golang を使用して、プロセスの存在確認を行う。
プロジェクト作成
go mod init で作成。
go mod init github.com/mikoto2000/TIL/golang/process/isExists/gopsutilライブラリ追加
go get で追加。
go get github.com/shirou/gopsutil/v3/process実装
gopsutil には func PidExists(pid int32) (bool, error) が存在するので、それを利用する。
■ main.go
package main
import (
    "github.com/shirou/gopsutil/v3/process"
    "log"
    "os"
    "strconv"
)
/**
 * コマンドライン引数のひとつ目に PID をうけとり、
 * その PID のプロセスが実行中かを表示する。
 */
func main() {
    pidString := os.Args[1]
    log.Printf("PID String: %s", pidString)
    pid, err := strconv.Atoi(pidString)
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("PID Decimal: %d", pid)
    // gopsutil を使って PID のプロセスの実行確認
    isRunning, err := process.PidExists(int32(pid))
    if err != nil {
        log.Fatal(err)
    }
    // 表示
    if isRunning {
        log.Printf("PID %d は実行中です。\n", pid)
    } else {
        log.Printf("PID %d は実行していません。\n", pid)
    }
}動作確認
Windows
試しに gvim
を起動して、それが実行中かを確認するとの、適当な PID
を入れて実行されていないのを確認する。
> Get-Process -Name gvim
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     16    20.49      39.34       4.72   30084   1 gvim
> .\gopsutil.exe 30084
2024/05/30 20:11:09 PID String: 30084
2024/05/30 20:11:09 PID Decimal: 30084
2024/05/30 20:11:09 PID 30084 は実行中です。
> .\gopsutil.exe 99999999
2024/05/30 20:11:18 PID String: 99999999
2024/05/30 20:11:18 PID Decimal: 99999999
2024/05/30 20:11:18 PID 99999999 は実行していません。OK そう。
Linux
試しに自分の bash が実行中かを確認するとの、適当な PID
を入れて実行されていないのを確認する。
$ ps
    PID TTY          TIME CMD
    234 pts/1    00:00:00 bash
  31817 pts/1    00:00:00 ps
$ ./gopsutil 234
2024/05/30 11:12:30 PID String: 234
2024/05/30 11:12:30 PID Decimal: 234
2024/05/30 11:12:30 PID 234 は実行中です。
$ ./gopsutil 9999999
2024/05/30 11:12:34 PID String: 9999999
2024/05/30 11:12:34 PID Decimal: 9999999
2024/05/30 11:12:34 PID 9999999 は実行していません。こちらも OK そう。
以上。
前回(syscall
を使う)よりも大分楽ができましたね!
0 件のコメント:
コメントを投稿