web-dev-qa-db-fra.com

Comment obtenir les détails du processus de son pid

J'ai maintenu une liste de pids de processus en cours d'exécution sur mon système (Linux) à partir de maintenant, ce serait bien si je peux obtenir les détails du processus de ce pid, je suis venu sur syscall.Getrusage () à golang mais je ne reçois résultats souhaités .. Quelqu'un a-t-il une idée à ce sujet 

40
geek

Ce n'est peut-être pas exactement ce que le demandeur voulait (il n'y a pas beaucoup d'informations claires sur le type de détails requis pour chaque ID de processus), mais vous pouvez obtenir certains détails d'une tâche par son pid en utilisant la commande BASH ps -p $PID (ps étant abrégé pour statut du processus)

Avec les options par défaut comme ps -p $PID, ceci retourne:

  • PID: écho l'identifiant du processus
  • ATS: le nom du terminal de contrôle (le cas échéant)
  • TIME: combien de temps CPU le processus a-t-il utilisé depuis son exécution (par exemple, 00:00:02)
  • CMD: la commande qui a appelé le processus (par exemple, Java)

Plus d'informations sur cet identifiant de processus peuvent être affichées à l'aide de l'indicateur d'options -o. Pour une liste, voir cette page de documentation .

Voici un exemple qui vous indique la commande complète d'un PID de processus particulier avec des arguments, des utilisateurs, des groupes et une utilisation de la mémoire (notez comment les indicateurs -o multiples prennent chacun une paire et comment la commande génère plusieurs bourrages d'espaces):

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

Astuce: pour la sortie en lecture humaine dans la console, argumentez la dernière option - elle sera généralement la plus longue et pourrait être raccourcie autrement.

68
user568458
ps -p PID -o comm=

Entrez le code ci-dessus où PID est le PID du processus.

9
Galeeb Basha

Vous pourriez regarder /proc/[pid]/stat. Par exemple, en utilisant 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))
    }
}

Sortie:

/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
peterSO

Tapez simplement ceci et vous obtiendrez ce que vous voulez, remplacez 'type_pid_here' par pid. 

cat /proc/type_pid_here/status
0
Saroj Rai