Я сохранил список pids процессов, выполняющихся в настоящее время на моей системе (Linux), теперь было бы здорово, если бы я мог получить детали процесса из этого pid, я пришел через syscall.Getrusage() в golang, но я я не получаю желаемых результатов. У кого-нибудь есть идея, связанная с ней.
Как получить детали процесса из своего pid
Ответ 1
Это может быть не совсем то, чего хотел искатель (нет четкой информации о том, какие данные требуются для каждого идентификатора процесса), но вы можете получить некоторые детали задачи своим pid, используя команду BASH ps -p $PID
(ps для краткости состояния процесса)
С настройками по умолчанию в качестве ps -p $PID
это возвращает:
- PID: echos идентификатор процесса
- TTY: имя управляющего терминала (если есть)
- ВРЕМЯ: сколько процессорного времени имеет процесс, используемый с момента его выполнения (например, 00:00:02)
- CMD: команда, вызвавшая процесс (например,
java
)
Более подробную информацию об этом идентификаторе процесса можно показать с помощью флага опций -o. Список см. В этой странице документации.
Вот один пример, который сообщает вам конкретную команду PID полного процесса с аргументами, использованием пользователей, групп и памяти (обратите внимание, как каждый флажок -o принимает пару, и как команда выводится с большим количеством пробелов):
ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
Совет: для вывода на чтение человека в консоли сделайте аргументы последней опцией - она будет самой длинной и может быть обрезана в противном случае.
Ответ 2
ps -p PID -o comm=
Введите код выше, где PID является PID процесса.
Ответ 3
Вы можете посмотреть /proc/[pid]/stat
. Например, используя Go 1,
package main
import (
"fmt"
"io/ioutil"
"os"
"strconv"
)
func Pids() ([]int, error) {
f, err := os.Open(`/proc`)
if err != nil {
return nil, err
}
defer f.Close()
names, err := f.Readdirnames(-1)
if err != nil {
return nil, err
}
pids := make([]int, 0, len(names))
for _, name := range names {
if pid, err := strconv.ParseInt(name, 10, 0); err == nil {
pids = append(pids, int(pid))
}
}
return pids, nil
}
func ProcPidStat(pid int) ([]byte, error) {
// /proc/[pid]/stat
// https://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html
filename := `/proc/` + strconv.FormatInt(int64(pid), 10) + `/stat`
return ioutil.ReadFile(filename)
}
func main() {
pids, err := Pids()
if err != nil {
fmt.Println("pids:", err)
return
}
if len(pids) > 0 {
pid := pids[0]
stat, err := ProcPidStat(pid)
if err != nil {
fmt.Println("pid:", pid, err)
return
}
fmt.Println(`/proc/[pid]/stat:`, string(stat))
}
}
Вывод:
/proc/[pid]/stat: 1 (init) S 0 1 1 0 -1 4202752 11119 405425 21 57 78 92 6643 527 20 0 1 0 3 24768512 563 184467440737095
Ответ 4
Вы можете использовать этот cat/proc/<PID>/status