我有一个Top
命令可以用来查看服务器中发生的情况:
ps -eo pid,cmd:50,%mem,%cpu --sort=-%mem | head 20
Run Code Online (Sandbox Code Playgroud)
基本上它正在使用ps
并删除一堆列。
对于每个进程 ID,我可以用来pwdx
查看源目录在哪里。
但是,我坚持将 加入pwdx
到上面命令的输出以将其添加为列。
你能帮忙吗?
很奇怪的是 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'
Run Code Online (Sandbox Code Playgroud)
无需pwdx
(或head
)。
一种方法是使用 AWK 提取每个 pid,并pwdx
在其上运行,合并输出:
ps -eo pid,cmd:50,%mem,%cpu --sort=-%mem | head -n 20 |\nawk \'NR == 1 { print $0 " CWD" };\n NR > 1 {\n printf "%s", $0;\n cmd = "exec pwdx " $1 " 2>&1"\n cmd | getline\n close(cmd)\n for (i = 2; i <= NF; i++)\n printf " %s", $i;\n printf "\\n"\n }\'\n
Run Code Online (Sandbox Code Playgroud)\n这将 \xe2\x80\x9cCWD\xe2\x80\x9d 标头添加到第一行以及所有后续行:
\nps
);pwdx
,并将输出(包括错误)读取到$0
;在解析的输出中包含错误pwdx
可确保它们不会\xe2\x80\x99t 弄乱整个输出,并显示而不是相应进程的当前目录(通常为 \xe2\x80\x9cPermission returned\xe2\x80\ x9d 表示当前用户无法读取其信息\xe2\x80\x99 的进程)。
这\xe2\x80\x99t特别有效,为pwdx
每个进程生成一个shell;但由于最多只能查看 19 个进程,因此\xe2\x80\x99 应该不会被注意到。St\xc3\xa9phane Chazelas\xe2\x80\x99 基于 Perl 的答案效率更高(也更短)。