Was ist falsch an diesem for
Schleife? Ich versuche herauszufinden, welcher Prozess die maximale Anzahl von Dateideskriptoren hat. Der erste Befehl im for
Schleife ps aux | awk '{print $2}'
druckt nur die Prozess-IDs aus. Ich kenne den ersten Fehler lsof: illegal process ID: PID
ist da, weil die erste Zeile der Ausgabe PID
ist , aber sollte die Schleife nicht für den Rest der Zeilen funktionieren?
[[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] ~]#
Warum führt es die Ausgabe von wc -l
aus anstatt zur Schleife zurückzukehren?
Oder gibt es eine andere Möglichkeit, den Prozess mit maximalen Dateideskriptoren zu finden?
Akzeptierte Antwort:
Das Problem sind die Backticks in Ihrem do ... done
Abschnitt.
Beim Schreiben von Shell-Skripten müssen Sie keine Blöcke kapseln (if; then ... fi
, while; do ... done
, usw.) in Backticks. Dies führt dazu, dass die Shell den Inhalt der Backticks auswertet und diesen Inhalt dann ausführt. Die Backticks geben also eine Zahl zurück (die Anzahl der geöffneten Dateien) und versuchen dann, diese Zahl auszuführen, was zu einem command not found
führt .
Sie wollen also:
for i in `ps aux | awk '{print $2}'` ; do lsof -p $i | wc -l ; done