最大のファイル記述子を持つプロセスを見つけるには?

最大のファイル記述子を持つプロセスを見つけるには?

このサイクルに何の問題がありますかfor?最大ファイル記述子数を所有するプロセスを見つけようとします。forループの最初のコマンドps aux | awk '{print $2}'はプロセスIDを印刷します。lsof: illegal process ID: PID出力の最初の行があるため、最初のエラーが存在することを知っていますが、残りの行ではPIDループが正しく機能しないのですか?

[root@serv5 ~]# for i in `ps aux | awk '{print $2}'` ; do `lsof -p $i | wc -l` ; done
lsof: illegal process ID: PID
lsof 4.82
 latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
 latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
 latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
 usage: [-?abhlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-f[gG]] [+|-e s]
 [-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
[+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
Use the ``-h'' option to get more help information.
-bash: 0: command not found
-bash: 22: command not found
-bash: 4: command not found
-bash: 4: command not found
-bash: 4: command not found
-bash: 4: command not found
^C
[root@serv5 ~]#

wc -lなぜ戻りループの代わりに出力を実行するのですか?

それとも、最大のファイル記述子を持つプロセスを見つける別の方法はありますか?

ベストアンサー1

問題はdo ... doneセクションのバックティックです。

if; then ... fiシェルスクリプトを作成するときは、ブロック(など)をバックティックで囲む必要はありませんwhile; do ... done。これにより、シェルはバックティックの内容を評価し、その内容を実行します。したがって、バックティックは数字(開いたファイル数)を返し、その数字を実行しようとするとcommand not found

したがって、あなたは以下が欲しいです:

for i in `ps aux | awk '{print $2}'` ; do lsof -p $i | wc -l ; done

おすすめ記事