Đây là một kịch bản cho thấy đầu ra tương tự như Solaris pstree . Không có tùy chọn nào được hỗ trợ và kết hợp người dùng không được hỗ trợ. Kịch bản này phải có thể mang theo cho tất cả các hệ thống POSIX. Trên một số hệ thống có ps
lệnh không tuân thủ POSIX, bạn có thể cần điều chỉnh các tùy chọn được truyền cho ps
. Kịch bản bao gồm hỗ trợ cụ thể cho các hệ thống BSD, vì vậy hầu hết các nền tảng nên được bảo hiểm.
#! /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];
}
}
}
'
ps axf
. Tôi thấy nó dễ đọc hơn.