Cosa c'è di sbagliato in questo for
ciclo continuo? Sto cercando di trovare quale processo ha il numero massimo di descrittori di file. Il primo comando nel for
loop ps aux | awk '{print $2}'
stampa solo gli ID di processo. Conosco il primo errore lsof: illegal process ID: PID
è presente perché la prima riga dell'output è PID
, ma il ciclo non dovrebbe funzionare correttamente per il resto delle righe?
[[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] ~]#
Perché sta eseguendo l'output di wc -l
invece di tornare al ciclo?
O c'è un altro modo per trovare il processo con il massimo dei descrittori di file?
Risposta accettata:
Il problema sono i backtick nel tuo do ... done
sezione.
Quando si scrive uno script di shell, non è necessario incapsulare i blocchi (if; then ... fi
, while; do ... done
, ecc) nei backtick. In questo modo la shell valuta il contenuto dei backtick e quindi esegue quel contenuto. Quindi i backtick restituiscono un numero (il numero di file aperti) e quindi tentano di eseguire quel numero, risultando in un command not found
.
Quindi vuoi:
for i in `ps aux | awk '{print $2}'` ; do lsof -p $i | wc -l ; done