如何同时使用 ps 和 pwdx?

Sae*_*ati 6 bash ps

我有一个Top命令可以用来查看服务器中发生的情况:

ps -eo pid,cmd:50,%mem,%cpu --sort=-%mem | head 20
Run Code Online (Sandbox Code Playgroud)

基本上它正在使用ps并删除一堆列。

对于每个进程 ID,我可以用来pwdx查看源目录在哪里。

但是,我坚持将 加入pwdx到上面命令的输出以将其添加为列。

你能帮忙吗?

Sté*_*las 9

很奇怪的是 procps 会包含 apspwdx命令而不提供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)。


Ste*_*itt 6

一种方法是使用 AWK 提取每个 pid,并pwdx在其上运行,合并输出:

\n
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 标头添加到第一行以及所有后续行:

\n
    \n
  • 输出当前行( 的输出ps);
  • \n
  • 在当前 pid 上运行pwdx,并将输出(包括错误)读取到$0;
  • \n
  • 输出第一个字段之后的所有字段(重复 pid);
  • \n
  • 结束该行。
  • \n
\n

在解析的输出中包含错误pwdx可确保它们不会\xe2\x80\x99t 弄乱整个输出,并显示而不是相应进程的当前目录(通常为 \xe2\x80\x9cPermission returned\xe2\x80\ x9d 表示当前用户无法读取其信息\xe2\x80\x99 的进程)。

\n

这\xe2\x80\x99t特别有效,为pwdx每个进程生成一个shell;但由于最多只能查看 19 个进程,因此\xe2\x80\x99 应该不会被注意到。St\xc3\xa9phane Chazelas\xe2\x80\x99 基于 Perl 的答案效率更高(也更短)。

\n