如何同时使用 ps 和 pwdx?

如何同时使用 ps 和 pwdx?

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

ps -eo pid,cmd:50,%mem,%cpu --sort=-%mem | head 20

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

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

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

你能帮忙吗?

答案1

很奇怪的是 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'

无需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 的答案效率更高(而且更短)。

相关内容