1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//go:build linux
package assets
import (
"os"
"path/filepath"
"strconv"
"strings"
"syscall"
)
func ProcessesOfUID(uid int, match func(argv []string) bool) []int {
dirs, err := os.ReadDir("/proc")
if err != nil {
return nil
}
var out []int
for _, d := range dirs {
pid, err := strconv.Atoi(d.Name())
if err != nil || pid == os.Getpid() {
continue
}
var st syscall.Stat_t
if syscall.Stat(filepath.Join("/proc", d.Name()), &st) != nil || int(st.Uid) != uid {
continue
}
b, err := os.ReadFile(filepath.Join("/proc", d.Name(), "cmdline"))
if err != nil || len(b) == 0 {
continue
}
if match(strings.Split(strings.TrimRight(string(b), "\x00"), "\x00")) {
out = append(out, pid)
}
}
return out
}