You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.5 KiB
67 lines
1.5 KiB
// +build linux freebsd darwin openbsd |
|
|
|
package common |
|
|
|
import ( |
|
"context" |
|
"os/exec" |
|
"strconv" |
|
"strings" |
|
) |
|
|
|
func CallLsofWithContext(ctx context.Context, invoke Invoker, pid int32, args ...string) ([]string, error) { |
|
var cmd []string |
|
if pid == 0 { // will get from all processes. |
|
cmd = []string{"-a", "-n", "-P"} |
|
} else { |
|
cmd = []string{"-a", "-n", "-P", "-p", strconv.Itoa(int(pid))} |
|
} |
|
cmd = append(cmd, args...) |
|
lsof, err := exec.LookPath("lsof") |
|
if err != nil { |
|
return []string{}, err |
|
} |
|
out, err := invoke.CommandWithContext(ctx, lsof, cmd...) |
|
if err != nil { |
|
// if no pid found, lsof returnes code 1. |
|
if err.Error() == "exit status 1" && len(out) == 0 { |
|
return []string{}, nil |
|
} |
|
} |
|
lines := strings.Split(string(out), "\n") |
|
|
|
var ret []string |
|
for _, l := range lines[1:] { |
|
if len(l) == 0 { |
|
continue |
|
} |
|
ret = append(ret, l) |
|
} |
|
return ret, nil |
|
} |
|
|
|
func CallPgrepWithContext(ctx context.Context, invoke Invoker, pid int32) ([]int32, error) { |
|
var cmd []string |
|
cmd = []string{"-P", strconv.Itoa(int(pid))} |
|
pgrep, err := exec.LookPath("pgrep") |
|
if err != nil { |
|
return []int32{}, err |
|
} |
|
out, err := invoke.CommandWithContext(ctx, pgrep, cmd...) |
|
if err != nil { |
|
return []int32{}, err |
|
} |
|
lines := strings.Split(string(out), "\n") |
|
ret := make([]int32, 0, len(lines)) |
|
for _, l := range lines { |
|
if len(l) == 0 { |
|
continue |
|
} |
|
i, err := strconv.Atoi(l) |
|
if err != nil { |
|
continue |
|
} |
|
ret = append(ret, int32(i)) |
|
} |
|
return ret, nil |
|
}
|
|
|