我有一个Top
命令可以用来查看服务器中发生的情况:
ps -eo pid,cmd:50,%mem,%cpu --sort=-%mem | head 20
基本上它正在使用ps
并删除一堆列。
对于每个进程 ID,我可以用来pwdx
查看源目录在哪里。
但是,我坚持将 加入pwdx
到上面命令的输出以将其添加为列。
你能帮忙吗?
答案1
很奇怪的是 procps 会包含 aps
和pwdx
命令而不提供ps -o cwd
.
在 Linux 上(ps
无论如何,你的命令调用已经是特定于 Linux (procps) 的),获取进程的c
当前工作w
目录d
只需执行 a 操作readlink("/proc/<pid>/cwd")
,因此你可以这样做:
ps -eo pid,cmd:50,%mem,%cpu --sort=-%mem |
perl -lane 'print "$_ " . ($. == 1 ? "CWD" : readlink("/proc/$F[0]/cwd"));
exit if $. == 20'
无需pwdx
(或head
)。
答案2
一种方法是使用 AWK 提取每个 pid,并pwdx
在其上运行,合并输出:
ps -eo pid,cmd:50,%mem,%cpu --sort=-%mem | head -n 20 |
awk 'NR == 1 { print $0 " CWD" };
NR > 1 {
printf "%s", $0;
cmd = "exec pwdx " $1 " 2>&1"
cmd | getline
close(cmd)
for (i = 2; i <= NF; i++)
printf " %s", $i;
printf "\n"
}'
这将在第一行和所有后续行上添加“CWD”标头:
- 输出当前行( 的输出
ps
); - 在当前 pid 上运行
pwdx
,并将输出(包括错误)读取到$0
; - 输出第一个字段之后的所有字段(重复 pid);
- 结束该行。
在解析的输出中包含错误pwdx
可确保它们不会弄乱整体输出,并且显示错误而不是相应进程的当前目录(通常,对于当前无法读取其信息的进程,“权限被拒绝”)用户)。
这并不是特别高效,会为pwdx
每个进程生成一个 shell;但由于最多只有 19 个进程可供查看,因此应该不会引起注意。Stéphane Chazelas 的基于 Perl 的答案效率更高(而且更短)。