lsof -p PID vs lsof | grep PID

12

Saya tidak mengerti ouput dari perintah lsof.

Ketika saya menulis

lsof -p PID

Saya mendapatkan 4 baris dan ketika saya menulis

lsof | grep PID

Saya mendapat ratusan baris.

Bukankah seharusnya mengembalikan hasil yang sama?

Terima kasih atas tanggapan Anda. Ini adalah output. Sepertinya ini adalah sub proses atau apa tugas ini artinya?

lsof -p 29076
COMMAND   PID  USER   FD      TYPE DEVICE SIZE/OFF NODE NAME
java    29076  pr    cwd   unknown                      /proc/29076/cwd (readlink: Permission denied)
java    29076  pr    rtd   unknown                      /proc/29076/root (readlink: Permission denied)
java    29076  pr    txt   unknown                      /proc/29076/exe (readlink: Permission denied)
java    29076  pr   NOFD                                /proc/29076/fd (opendir: Permission denied)

lsof |grep 29076|head -20
java      29076        pr  cwd   unknown                          /proc/29076/cwd (readlink: Permission denied)
java      29076        pr  rtd   unknown                          /proc/29076/root (readlink: Permission denied)
java      29076        pr  txt   unknown                          /proc/29076/exe (readlink: Permission denied)
java      29076        pr NOFD                                    /proc/29076/fd (opendir: Permission denied)
java      29076   300  pr  cwd   unknown                          /proc/29076/task/300/cwd (readlink: Permission denied)
java      29076   300  pr  rtd   unknown                          /proc/29076/task/300/root (readlink: Permission denied)
java      29076   300  pr  txt   unknown                          /proc/29076/task/300/exe (readlink: Permission denied)
java      29076   300  pr NOFD                                    /proc/29076/task/300/fd (opendir: Permission denied)
java      29076   329  pr  cwd   unknown                          /proc/29076/task/329/cwd (readlink: Permission denied)
java      29076   329  pr  rtd   unknown                          /proc/29076/task/329/root (readlink: Permission denied)
java      29076   329  pr  txt   unknown                          /proc/29076/task/329/exe (readlink: Permission denied)
java      29076   329  pr NOFD                                    /proc/29076/task/329/fd (opendir: Permission denied)
java      29076   330  pr  cwd   unknown                          /proc/29076/task/330/cwd (readlink: Permission denied)
java      29076   330  pr  rtd   unknown                          /proc/29076/task/330/root (readlink: Permission denied)
java      29076   330  pr  txt   unknown                          /proc/29076/task/330/exe (readlink: Permission denied)
java      29076   330  pr NOFD                                    /proc/29076/task/330/fd (opendir: Permission denied)
java      29076   331  pr  cwd   unknown                          /proc/29076/task/331/cwd (readlink: Permission denied)
java      29076   331  pr  rtd   unknown                          /proc/29076/task/331/root (readlink: Permission denied)
java      29076   331  pr  txt   unknown                          /proc/29076/task/331/exe (readlink: Permission denied)
java      29076   331  pr NOFD                                    /proc/29076/task/331/fd (opendir: Permission denied)
IL Mare
sumber

Jawaban:

7

Tanpa melihat output aktual, sulit untuk mengatakan apa yang sebenarnya terjadi, tetapi saya menduga itu disebabkan oleh fakta bahwa lsof -p PIDperintah tersebut hanya mencetak file yang dibuka oleh PID yang ditentukan saat lsof | grep PIDsedang mencetak setiap baris di mana 'PID' adalah terletak di mana saja di baris. Misalnya, jika Anda mencari PID = 123 maka grepopsi Anda juga akan mencetak baris untuk PID 1231, 1232, 1233, dll. Serta file apa pun yang berada di folder dengan 123 di mana saja di jalur penuh mereka.

EDIT: Dalam contoh spesifik Anda perbedaannya lsofadalah mengabaikan file yang dibuka oleh utas. Jika Anda melihat output dalam grepcontoh, kolom ketiga adalah 'ID TID' atau Thread. Baris tanpa TID cocok dengan apa yang Anda lihat ketika Anda menggunakan -popsi. Baris dengan TID (mis. Garis dibuka oleh utas lain) adalah ekstra.

David King
sumber
Sebenarnya, TID disebut di halaman manual sebagai "Nomor Identifikasi Tugas", tidak harus berupa Thread ID.
Miljen Mikic
2

lsof - daftar file yang terbuka, cobalah membaca halaman manual untuk lsof #man lsof

lsof -p PID daftar file yang terbuka terkait dengan id proses PID.

Dengan tidak adanya opsi apa pun, lsof mencantumkan semua file yang terbuka milik semua proses aktif. ketika Anda melakukannya lsof | grep PID, ia mencantumkan semua file terbuka yang dimiliki oleh semua proses aktif dan mengambil nomor PID, yang dapat cocok dengan PID itu sendiri dan juga di mana saja, di mana PID muncul sebagai bagian dari PID lain dan mungkin juga merupakan proses turunan dari PID, dan begitu seterusnya.

Karena itu, jika Anda ingin menggunakan lsof | grep PIDmaka Anda harus mencocokkan PID dengan tepat, seperti kecocokan kata lengkap lsof | grep -w PID, tetapi masih akan menghasilkan lebih banyak baris jika PID memiliki proses anak lainnya.

Ijaz Ahmad Khan
sumber
0

Saya mencoba ini pada sistem saya, dan kedua perintah menghasilkan daftar yang sama, saya sarankan Anda mencoba kedua perintah secara berurutan beberapa kali, hanya untuk memastikan bahwa keadaan proses stabil. Menurut halaman manual dan output Anda, ini adalah satu-satunya penjelasan yang bisa saya miliki.

pengguna148564
sumber