このfor
の何が問題になっていますか ループ?ファイル記述子の最大数を持つプロセスを見つけようとしています。 for
の最初のコマンド ループps aux | awk '{print $2}'
プロセスIDのみを出力します。最初のエラーlsof: illegal process ID: PID
を知っています 出力の1行目がPID
であるため、そこにあります 、しかし、ループは残りの行で正常に機能するべきではありませんか?
[[email protected] ~]# 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
[[email protected] ~]#
wc -l
の出力を実行するのはなぜですか ループに戻る代わりに?
または、最大のファイル記述子を持つプロセスを見つける別の方法はありますか?
承認された回答:
問題は、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