psとpwdxを同時に使う方法は?

psとpwdxを同時に使う方法は?

Topサーバーで何が起こっているかを確認するために使用できるコマンドがあります。

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

ps既定では、複数の列を使用して削除します。

pwdx各プロセスIDについて、ソースディレクトリがどこにあるかを確認するために使用できます。

しかし、pwdx上記のコマンドの出力を組み合わせて列として追加するのに問題があります。

助けてもらえますか?

答え1

psprocpsにはpwdxコマンドが含まれていますが、これを提供しないのは奇妙ですps -o cwd

Linuxで(psとにかくコマンド呼び出しはすでにLinuxのみ(procps)です)プロセスの現在のc作業wディレクトリを取得するには、次のようにします。dreadlink("/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

1つの方法は、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見ているプロセスは最大19個であるため、目立たないことに注意してください。Stéphane ChazelasのPerlベースの回答より効率的で短いです。

関連情報