Как получить детали процесса из его pid - PullRequest
44 голосов
/ 21 февраля 2012

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

Ответы [ 4 ]

72 голосов
/ 08 декабря 2012

Возможно, это не совсем то, что хотел запрашивающий (нет точной информации о том, какой тип деталей требуется для каждого идентификатора процесса), но вы можете получить некоторые детали задачи по ее pid с помощью команды BASH ps -p $PID ( пс сокращенно для состояния процесса )

С параметрами по умолчанию, такими как ps -p $PID, возвращается:

  • PID: выводит идентификатор процесса
  • TTY: название управляющего терминала (если есть)
  • ВРЕМЯ: сколько времени ЦП использует процесс с момента выполнения (например, 00:00:02)
  • CMD: команда, которая вызвала процесс (например, java)

Дополнительная информация об этом идентификаторе процесса может быть показана с помощью флага -o опции. Список см. на этой странице документации .

Вот один пример, который сообщает вам полную команду PID процесса с аргументами, пользователем, группой и использованием памяти (обратите внимание, как каждый из флагов -o принимает пару, и как команда выводит с большим количеством пробелов):

ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS

Подсказка: для вывода в консоли для чтения человеком сделайте args последней опцией - обычно она будет самой длинной и в противном случае может обрезаться.

9 голосов
/ 25 апреля 2017
ps -p PID -o comm=

Введите указанный выше код, где PID - это PID процесса.

5 голосов
/ 21 февраля 2012

Вы можете посмотреть на /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
1 голос
/ 17 января 2019

Просто введите это, и вы получите то, что хотите, замените 'type_pid_here' на pid.

cat /proc/type_pid_here/status
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...