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() {
:= os.Args[1]
pidString .Printf("PID String: %s", pidString)
log
, err := strconv.Atoi(pidString)
pidif err != nil {
.Fatal(err)
log}
.Printf("PID Decimal: %d", pid)
log
// gopsutil を使って PID のプロセスの実行確認
, err := process.PidExists(int32(pid))
isRunningif err != nil {
.Fatal(err)
log}
// 表示
if isRunning {
.Printf("PID %d は実行中です。\n", pid)
log} else {
.Printf("PID %d は実行していません。\n", pid)
log}
}
動作確認
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
を使う)よりも大分楽ができましたね!