Quel est le problème avec ce for
boucle? J'essaie de trouver quel processus a le nombre maximum de descripteurs de fichiers. La première commande dans le for
boucle ps aux | awk '{print $2}'
imprime uniquement les ID de processus. Je connais la première erreur lsof: illegal process ID: PID
est là parce que la 1ère ligne de la sortie est PID
, mais la boucle ne devrait-elle pas fonctionner correctement pour le reste des lignes ?
[[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] ~]#
Pourquoi exécute-t-il la sortie de wc -l
au lieu de revenir à la boucle ?
Ou existe-t-il un autre moyen de trouver le processus avec un maximum de descripteurs de fichiers ?
Réponse acceptée :
Le problème est les backticks dans votre do ... done
rubrique.
Lors de l'écriture d'un script shell, vous n'avez pas besoin d'encapsuler des blocs (if; then ... fi
, while; do ... done
, etc) en backticks. Cela entraîne l'évaluation par le shell du contenu des backticks, puis l'exécution de ce contenu. Ainsi, les backticks renvoient un nombre (le nombre de fichiers ouverts), puis tentent d'exécuter ce nombre, ce qui entraîne une command not found
.
Ainsi vous voulez :
for i in `ps aux | awk '{print $2}'` ; do lsof -p $i | wc -l ; done