lsof -p PID เทียบกับ lsof | PID ของ grep


12

ฉันไม่เข้าใจ ouput ของคำสั่ง lsof

เมื่อฉันเขียน

lsof -p PID

ฉันได้ 4 บรรทัดและเมื่อฉันเขียน

lsof | grep PID

ฉันได้รับหลายร้อยบรรทัด

มันจะไม่ส่งคืนผลลัพธ์เดียวกันหรือไม่

ขอบคุณสำหรับคำตอบของคุณ นี่คือผลลัพธ์ ดูเหมือนว่าจะเป็นกระบวนการย่อยหรืองานนี้หมายถึงอะไร?

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)

คำตอบ:


7

โดยไม่ได้เห็นผลลัพธ์จริงมันยากที่จะบอกว่าเกิดอะไรขึ้น แต่ฉันเดาว่ามันเกิดจากความจริงที่ว่าlsof -p PIDคำสั่งเป็นเพียงการพิมพ์ไฟล์ที่เปิดโดย PID ที่ระบุในขณะที่lsof | grep PIDกำลังพิมพ์บรรทัดใด ๆ ที่ 'PID' ตั้งอยู่ที่ใดก็ได้ในบรรทัด ตัวอย่างเช่นหากคุณกำลังค้นหา PID = 123 grepตัวเลือกของคุณจะพิมพ์บรรทัดสำหรับ PID ของ 1231, 1232, 1233 ฯลฯ รวมถึงไฟล์ใด ๆ ที่อยู่ในโฟลเดอร์ที่มี 123 ทุกที่ในเส้นทางแบบเต็ม

แก้ไข: ในตัวอย่างเฉพาะของคุณความแตกต่างlsofคือการละเว้นไฟล์ที่เปิดโดยเธรด หากคุณดูผลลัพธ์ในgrepตัวอย่างคอลัมน์ที่สามคือ 'TID' หรือ ID เธรด บรรทัดที่ไม่มี TID ตรงกับสิ่งที่คุณเห็นเมื่อคุณใช้-pตัวเลือก บรรทัดที่มี TID (เช่น. บรรทัดที่เปิดโดยเธรดอื่น ๆ ) เป็นส่วนเสริม


ที่จริงแล้ว TID ถูกอ้างถึงใน man pages ว่า "หมายเลขการระบุภารกิจ" ซึ่งไม่จำเป็นต้องเป็น ID ของเธรด
Miljen Mikic

2

lsof - แสดงรายการไฟล์ที่เปิดอยู่พยายามอ่าน man page สำหรับ lsof #man lsof

lsof -p PID แสดงรายการไฟล์ที่เปิดซึ่งเชื่อมโยงกับ ID กระบวนการของ PID

หากไม่มีตัวเลือกใด ๆ lsof จะแสดงรายการไฟล์ที่เปิดอยู่ทั้งหมดที่เป็นของกระบวนการที่ใช้งานอยู่ทั้งหมด เมื่อคุณทำเช่นlsof | grep PIDนั้นมันจะแสดงรายการไฟล์ที่เปิดทั้งหมดที่เป็นของกระบวนการที่ใช้งานอยู่ทั้งหมดและ grep หมายเลข PID ซึ่งสามารถจับคู่กับ PID เองและที่ใดก็ได้โดยที่ PID ปรากฏเป็นส่วนหนึ่งของ PID อื่น ๆ และอาจเป็นกระบวนการย่อยของ PID เช่นกัน เป็นต้น

ดังนั้นหากคุณต้องการใช้lsof | grep PIDคุณควรจับคู่ PID ให้ตรงกันทั้งหมดเช่นจับคู่คำlsof | grep -w PIDทั้งหมด แต่จะยังคงส่งผลให้มีสายมากขึ้นถ้า PID มีกระบวนการลูกอื่น ๆ


0

ฉันลองสิ่งนี้ในระบบของฉันและทั้งสองคำสั่งสร้างรายการเดียวกันฉันขอแนะนำให้คุณลองทั้งสองคำสั่งติดต่อกันหลายครั้งเพื่อให้แน่ใจว่าสถานะของกระบวนการมีเสถียรภาพ ตามหน้า man และ outputs ของคุณนี่เป็นคำอธิบายเดียวที่ฉันมี


0

lsof บางเวอร์ชันมี id ของเธรด สามารถกำหนดได้โดยส่วนหัวคอลัมน์ TID ที่ปรากฏในเอาต์พุต ผลลัพธ์ดังกล่าวจะทำให้เกิดการซ้ำซ้อนของรายการเนื่องจาก lsof อาจแสดงรายการที่ซ้ำกันหนึ่งรายการสำหรับแต่ละเธรด

https://support.datastax.com/hc/en-us/articles/209826153-lsof-shows-Cassandra-is-holding-a-large-amount-of-files-open

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.