Подтвердить что ты не робот

Как получить детали процесса из своего pid

Я сохранил список pids процессов, выполняющихся в настоящее время на моей системе (Linux), теперь было бы здорово, если бы я мог получить детали процесса из этого pid, я пришел через syscall.Getrusage() в golang, но я я не получаю желаемых результатов. У кого-нибудь есть идея, связанная с ней.

4b9b3361

Ответ 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