func findJVMs()

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
}