这个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 ~]#
Run Code Online (Sandbox Code Playgroud)
为什么它执行输出wc -l
而不是回到循环?
还是有另一种方法可以找到具有最大文件描述符的进程?
问题是您do ... done
部分中的反引号。
在编写shell脚本,你并不需要封装块(if; then ... fi
,while; do ... done
在反引号等)。这样做会导致 shell 评估反引号的内容,然后执行该内容。因此,反引号返回一个数字(打开文件的数量),然后尝试运行该数字,结果是command not found
.
因此你想要:
for i in `ps aux | awk '{print $2}'` ; do lsof -p $i | wc -l ; done
Run Code Online (Sandbox Code Playgroud)