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
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:
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.
ps -p PID -o comm=
Entrez le code ci-dessus où PID est le PID du processus.
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
Tapez simplement ceci et vous obtiendrez ce que vous voulez, remplacez 'type_pid_here' par pid.
cat /proc/type_pid_here/status