45 lines
917 B
Go
45 lines
917 B
Go
//go:build windows
|
|
|
|
package ipc
|
|
|
|
import (
|
|
"context"
|
|
"encoding/csv"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func processAlive(pid int) (bool, error) {
|
|
if pid <= 0 {
|
|
return false, nil
|
|
}
|
|
if pid == os.Getpid() {
|
|
return true, nil
|
|
}
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
out, err := exec.CommandContext(ctx, "tasklist", "/FI", fmt.Sprintf("PID eq %d", pid), "/FO", "CSV", "/NH").Output()
|
|
if err != nil {
|
|
return false, fmt.Errorf("probe process liveness: %w", err)
|
|
}
|
|
r := csv.NewReader(strings.NewReader(string(out)))
|
|
r.FieldsPerRecord = -1
|
|
records, err := r.ReadAll()
|
|
if err != nil {
|
|
return false, fmt.Errorf("parse tasklist output: %w", err)
|
|
}
|
|
pidStr := strconv.Itoa(pid)
|
|
for _, record := range records {
|
|
if len(record) > 1 {
|
|
if strings.Trim(record[1], ` "`) == pidStr {
|
|
return true, nil
|
|
}
|
|
}
|
|
}
|
|
return false, nil
|
|
}
|