
Top
サーバーで何が起こっているかを確認するために使用できるコマンドがあります。
ps -eo pid,cmd:50,%mem,%cpu --sort=-%mem | head 20
ps
既定では、複数の列を使用して削除します。
pwdx
各プロセスIDについて、ソースディレクトリがどこにあるかを確認するために使用できます。
しかし、pwdx
上記のコマンドの出力を組み合わせて列として追加するのに問題があります。
助けてもらえますか?
答え1
ps
procpsにはpwdx
コマンドが含まれていますが、これを提供しないのは奇妙ですps -o cwd
。
Linuxで(ps
とにかくコマンド呼び出しはすでにLinuxのみ(procps)です)プロセスの現在のc
作業w
ディレクトリを取得するには、次のようにします。d
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
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ベースの回答より効率的で短いです。