Outil de style Solaris ptree pour Linux


8

Je cherche l'outil Linux qui imprimera la même sortie que le ptree Solaris. Par exemple:

# ptree 538
538   /usr/lib/ssh/sshd
  889   /usr/lib/ssh/sshd
    890   /usr/lib/ssh/sshd
      1498  -sh
        1649  bash
          1656  -sh
            1660  bash
              13716 ptree 538

Je suis conscient que pstree existe, mais je n'aime pas son format de sortie. Quelqu'un connaît-il des outils similaires?

Réponses:


7

C'est tout ce que je sais qui ressemble le plus à ptree sous linux

ps -ejH

3
Ou ps axf. Je le trouve plus lisible.
manatwork

ou mêmeps axf -o pid,command
jlliagre

5

Voici un script qui affiche une sortie similaire à Solaris pstree . Aucune option n'est prise en charge et la correspondance utilisateur n'est pas prise en charge. Ce script doit être portable sur tous les systèmes POSIX. Sur certains systèmes dont la pscommande n'est pas compatible POSIX, vous devrez peut-être ajuster les options transmises à ps. Le script inclut un support spécifique pour les systèmes BSD, donc la plupart des plateformes doivent être couvertes.

#! /bin/sh
## Usage: $0 [PID...]
## Show the processes on the system. For each process, show the process
## id followed by the command line. Show child processes after their parent,
## indented.
## If one or more PIDs are specified, only show the ancestors and
## descendants of those PIDs. If no PID is specified, show the subtree
## rooted at PID 1.
## This utility mimics Solaris pstree(1).
case $(uname) in *BSD*) ps_A='-ax';; *) ps_A='-A';; esac
ps $ps_A -o pid= -o ppid= -o args= |
sort -k 1n |
awk -v targets="$*" '
# children[p]: the " "-separated list of the pids of the children of p
# cmd[p]: command line of p
# list[lb..le]: list of pids yet to traverse
# depth[p]: depth of process p: depth(child) = depth(parent) + 1
# parent[p]: pid of the parent of p
# show[p]: 1 to show p, 2 to show p and all its descendants
BEGIN {
    list[0] = 0; lb = 0; le = 0;
    depth[0] = -1;
}
{
    pid=$1; ppid=$2;
    sub(/^ *[0-9]+ +[0-9]+ /, "");
    if (pid == ppid) {
        # This process is a root: add it to the list of processes to taverse
        list[++le] = pid;
    } else {
        children[ppid] = children[ppid] " " pid;
        parent[pid] = ppid;
    }
    cmd[pid] = $0;
}
END {
    # Parse targets into a list of pids (or 1 if none is specified).
    split("_" targets, a, /[^0-9]+/);
    delete a[1];
    if (a[2] == "") a[2] = 1;
    for (i in a) {
        show[a[i]] = 2; # Show targets recursively
        p = parent[a[i]];
        # Show target ancestors
        while (p && !show[p]) {
            show[p] = 1; 
            p = parent[p];
        }
    }

    # Traverse the list of processes
    while (lb <= le) {
        pid = list[lb++];
        # Add children to the list of processes to traverse
        split(children[pid], a);
        for (i in a) {
            list[--lb] = a[i];
            depth[a[i]] = depth[pid] + 1;
            if (show[pid] > 1) show[a[i]] = show[pid];
        }
        # Show the current process if desired, indenting to the right depth
        if (show[pid]) {
            for (i = 1; i <= depth[pid]; i++) printf("  ");
            printf("%-5d ", pid);
            print cmd[pid];
        }
    }
}
'

2

Ce n'est probablement pas exactement ce que vous recherchez, mais d'autres pourraient l'apprécier.

htopa une vue arborescente si vous appuyez sur F5.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.