GNU/Linux >> Belajar Linux >  >> Linux

Menghitung file terbuka per proses

Coba ini:

ps aux | sed 1d | awk '{print "fd_count=$(lsof -p " $2 " | wc -l) && echo " $2 " $fd_count"}' | xargs -I {} bash -c {}

Saya menggunakan ini untuk menemukan proses yang memakan filehandler teratas untuk pengguna tertentu (nama pengguna) yang tidak memiliki lsof atau akses root:

for pid in `ps -o pid -u username` ; do echo "$(ls /proc/$pid/fd/ 2>/dev/null | wc -l ) for PID: $pid" ; done  | sort -n | tail

Lihat /proc/ sistem file:

ls /proc/$pid/fd/ | wc -l

Untuk melakukan ini untuk semua proses, gunakan ini:

cd /proc
for pid in [0-9]*
do
    echo "PID = $pid with $(ls /proc/$pid/fd/ | wc -l) file descriptors"
done

Sebagai one-liner (filter dengan menambahkan | grep -v "0 FDs" ):

for pid in /proc/[0-9]*; do printf "PID %6d has %4d FDs\n" $(basename $pid) $(ls $pid/fd | wc -l); done

Sebagai one-liner termasuk nama perintah, diurutkan berdasarkan jumlah deskriptor file dalam urutan menurun (batasi hasil dengan menambahkan | head -10 ):

for pid in /proc/[0-9]*; do p=$(basename $pid); printf "%4d FDs for PID %6d; command=%s\n" $(ls $pid/fd | wc -l) $p "$(ps -p $p -o comm=)"; done | sort -nr

Kredit ke @Boban untuk tambahan ini:

Anda dapat menyalurkan keluaran skrip di atas ke skrip berikut untuk melihat sepuluh proses (dan namanya) yang membuka sebagian besar deskriptor file:

  ...
done | sort -rn -k5 | head | while read -r _ _ pid _ fdcount _
do
  command=$(ps -o cmd -p "$pid" -hc)
  printf "pid = %5d with %4d fds: %s\n" "$pid" "$fdcount" "$command"
done

Berikut pendekatan lain untuk membuat daftar sepuluh proses teratas dengan fd paling terbuka, mungkin kurang dapat dibaca, jadi saya tidak meletakkannya di depan:

find /proc -maxdepth 1 -type d -name '[0-9]*' \
     -exec bash -c "ls {}/fd/ | wc -l | tr '\n' ' '" \; \
     -printf "fds (PID = %P), command: " \
     -exec bash -c "tr '\0' ' ' < {}/cmdline" \; \
     -exec echo \; | sort -rn | head

Linux
  1. Membangun wadah dengan tangan:Ruang nama PID

  2. Tidak Dapat Membunuh Proses Gedit Dari Pidnya?

  3. Max membuka file untuk proses kerja

  1. Menghitung file secara rekursif dalam direktori Linux

  2. Bagaimana cara mengatur file terbuka nginx max?

  3. umask saat ini dari proses dengan <pid>

  1. Bagaimana saya bisa mengetahui file apa yang telah dibuka oleh suatu proses?

  2. Apakah file .pid dapat diandalkan untuk menentukan apakah suatu proses sedang berjalan?

  3. Cara mendapatkan pid dari proses yang baru saja dimulai