Apa yang salah dengan for
ini? lingkaran? Saya mencoba menemukan proses mana yang memiliki jumlah deskriptor file maksimum. Perintah pertama di for
loop ps aux | awk '{print $2}'
hanya mencetak ID proses. Saya tahu kesalahan pertama lsof: illegal process ID: PID
apakah ada karena baris pertama dari output adalah PID
, tetapi bukankah perulangan akan berfungsi dengan baik untuk sisa baris lainnya?
[[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] ~]#
Mengapa menjalankan output wc -l
bukannya kembali ke loop?
Atau adakah cara lain agar saya dapat menemukan proses dengan deskriptor file maksimum?
Jawaban yang Diterima:
Masalahnya adalah backtick di do ... done
your Anda bagian.
Saat menulis skrip shell, Anda tidak perlu mengenkapsulasi blok (if; then ... fi
, while; do ... done
, dll) di backticks. Melakukannya menghasilkan shell mengevaluasi konten backticks, dan kemudian mengeksekusi konten itu. Jadi backticks mengembalikan nomor (jumlah file yang terbuka), dan kemudian mencoba menjalankan nomor itu, menghasilkan command not found
.
Jadi Anda ingin:
for i in `ps aux | awk '{print $2}'` ; do lsof -p $i | wc -l ; done