Co je špatného na tomto for
smyčka? Snažím se zjistit, který proces má maximální počet deskriptorů souborů. První příkaz v for
smyčka ps aux | awk '{print $2}'
vytiskne pouze ID procesů. Znám první chybu lsof: illegal process ID: PID
je tam, protože 1. řádek výstupu je PID
, ale neměla by smyčka fungovat dobře pro zbytek řádků?
[[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] ~]#
Proč provádí výstup wc -l
místo návratu do smyčky?
Nebo existuje jiný způsob, jak mohu najít proces s maximálním počtem deskriptorů souborů?
Přijatá odpověď:
Problémem je zpětné zaškrtnutí ve vašem do ... done
sekce.
Při psaní skriptu shellu nemusíte bloky zapouzdřovat (if; then ... fi
, while; do ... done
atd.) Pokud tak učiníte, shell vyhodnotí obsah backticks a poté tento obsah spustí. Takže backticks vrací číslo (počet otevřených souborů) a poté se pokoušejí toto číslo spustit, což má za následek command not found
.
Takže chcete:
for i in `ps aux | awk '{print $2}'` ; do lsof -p $i | wc -l ; done