nightingale/vendor/github.com/toolkits/pkg/sys/proc.go

56 lines
897 B
Go

package sys
import (
"fmt"
"strconv"
"strings"
"github.com/toolkits/pkg/file"
)
func PidsByCmdline(cmdline string) []int {
ret := []int{}
var dirs []string
dirs, err := file.DirsUnder("/proc")
if err != nil {
return ret
}
count := len(dirs)
for i := 0; i < count; i++ {
pid, err := strconv.Atoi(dirs[i])
if err != nil {
continue
}
cmdlineFile := fmt.Sprintf("/proc/%d/cmdline", pid)
if !file.IsExist(cmdlineFile) {
continue
}
cmdlineBytes, err := file.ReadBytes(cmdlineFile)
if err != nil {
continue
}
cmdlineBytesLen := len(cmdlineBytes)
if cmdlineBytesLen == 0 {
continue
}
noNut := make([]byte, 0, cmdlineBytesLen)
for j := 0; j < cmdlineBytesLen; j++ {
if cmdlineBytes[j] != 0 {
noNut = append(noNut, cmdlineBytes[j])
}
}
if strings.Contains(string(noNut), cmdline) {
ret = append(ret, pid)
}
}
return ret
}