in cmd/hotdog-hotpatch/main.go [156:203]
func findJVMs() []*jvm {
proc, err := ioutil.ReadDir("/proc")
if err != nil {
return nil
}
jvms := make([]*jvm, 0)
for _, p := range proc {
if !p.IsDir() {
continue
}
cmdline, err := ioutil.ReadFile(filepath.Join("/proc", p.Name(), "cmdline"))
if err != nil {
continue
}
cmd := strings.SplitN(string(cmdline), string(rune(0)), 2)[0]
if filepath.Base(cmd) != processName {
continue
}
pid, err := strconv.Atoi(p.Name())
if err != nil {
continue
}
logger.Printf("Found %s: %d", processName, pid)
exePath, err := os.Readlink(filepath.Join("/proc", p.Name(), "exe"))
if err != nil {
logger.Printf("Failed to readlink for %d", pid)
continue
}
euid, egid, err := findEUID(pid)
if err != nil {
logger.Printf("Failed to find EUID for %d: %v", pid, err)
}
versionOut, err := commandDroppedPrivs(exePath, []string{"-version"}, euid, egid, pid)
if err != nil {
logger.Printf("Failed to execute %q for %d: %v", "java -version", pid, err)
continue
}
jvms = append(jvms, &jvm{
pid: pid,
path: exePath,
euid: euid,
egid: egid,
version: string(versionOut),
})
}
return jvms
}