¿Qué tiene de malo este for
? ¿círculo? Estoy tratando de encontrar qué proceso tiene la cantidad máxima de descriptores de archivos. El primer comando en for
bucle ps aux | awk '{print $2}'
imprime solo los ID de proceso. Conozco el primer error lsof: illegal process ID: PID
está allí porque la primera línea de la salida es PID
, pero ¿no debería funcionar bien el ciclo para el resto de las líneas?
[[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] ~]#
¿Por qué está ejecutando la salida de wc -l
? en lugar de volver al bucle?
¿O hay otra manera de encontrar el proceso con el máximo de descriptores de archivo?
Respuesta aceptada:
El problema son los acentos graves en tu do ... done
sección.
Al escribir un script de shell, no necesita encapsular bloques (if; then ... fi
, while; do ... done
, etc) en acentos graves. Hacerlo da como resultado que el shell evalúe el contenido de los acentos graves y luego ejecute ese contenido. Entonces, los acentos graves devuelven un número (el número de archivos abiertos) y luego intentan ejecutar ese número, lo que resulta en un command not found
.
Así quieres:
for i in `ps aux | awk '{print $2}'` ; do lsof -p $i | wc -l ; done