Apa perbedaan antara `lsof -p <pid> | wc -l` dan `ls / proc / <pid> / fd | wc -l`?

12

Latar Belakang: Saya bermain-main dengan memonitor ulimit untuk menjalankan proses untuk pengguna tertentu. (Saya sesekali melihat proses yang memulai dengan batas yang salah.) Saya bertanya pada beberapa guru Linux yang mengaku diri sendiri, dan yang satu menyarankan lsof -p <pid>, sementara yang lain menyarankan ls /proc/<pid>/fd, tetapi tidak ada yang positif tentang yang lebih akurat mencerminkan jumlah aktual menuju maks. buka file batas untuk suatu proses.

Jadi, mana yang benar?

lsof -p <pid> | wc -l

Atau

ls /proc/<pid>/fd | wc -l

Tolong jelaskan perbedaannya. Terima kasih!

Jared
sumber
3
Kedengarannya seperti pekerjaan rumah.
ewwhite
1
Bukan pekerjaan rumah. Menambahkan penjelasan yang lebih baik. Saya telah membaca lsofhalaman manual, dan sementara saya menduga jawabannya adalah file yang dipetakan dengan memori, saya ingin konfirmasi orang yang lebih berpengalaman.
Jared

Jawaban:

10

lsof juga akan memberi Anda memori .so-file yang dipetakan - yang secara teknis tidak sama dengan file yang dikendalikan aplikasi. /proc/<pid>/fdadalah titik pengukuran untuk deskriptor file terbuka - namun: Disebutkan di halaman proc-man - jika utas utama dari program multithread telah diakhiri, direktori ini tidak akan tersedia.

lsof -p <pid> | grep -v mem | egrep -v '^COMMAND PID' | wc -l akan menampilkan barang yang sama dengan Anda ls /proc/<pid>/fd | wc -l .

Peta memori tersedia di /proc/<pid>/maps.

Kvisle
sumber
Ini lsofmemberi Anda output yang hampir sama, tetapi juga termasuk cwd, rtddan txtfile deskriptor.
Ian Bamforth
Perhatikan juga bahwa jumlah ruang antara COMMANDdan PIDdapat bervariasi. Ganti spasi dengan [[:space:]]*agar lebih umum.
Ian Bamforth
Saya juga menemukan di lsof -a -p <pid> -d ^mem -d ^cwd -d ^rtd -d ^txt -d ^DEL | wc -l sini , sedangkan lsofdi Android shell ( adb shell) tidak mendukung -adan -d. Jadi saya akhirnya menggunakan versi Kvisle.
Akhir pekan