ls ใช้เวลานานในไดเรกทอรีขนาดเล็ก


21

ใช้ Ubuntu ฉันเปิดเทอร์มินัลแล้วทำ

sudo bash
cd /
ls | head -n 1000

และส่งคืนไดเรกทอรีประมาณ 20 รายการ

อย่างไรก็ตามถ้าฉันทำ ls และไม่ได้แปะไปที่ใด ls ก็แค่ค้างไว้ที่นั่นจนกว่าฉันจะฆ่ามันจากเทอร์มินัลอื่น อาจเกิดอะไรขึ้น

แก้ไข:

> type ls
ls is aliased to `ls --color=auto`

แก้ไข:

> /bin/ls /
<normal response>
> /bin/ls --color=auto
<hangs indefinitely>

เหตุใดการระบายสีเอาต์พุตของ ls ทำให้คำสั่งนี้หยุดทำงาน


3
เรียกใช้type lsเพื่อตรวจสอบนามแฝงที่เป็นไปได้ ฯลฯ
jw013

5
การทำงานstrace lsอาจช่วยให้คุณระบุปัญหาได้ straceแสดงการเรียกใช้ระบบทั้งหมดที่ทำโดยโปรแกรมที่เรียกใช้
Gowtham

2
ลอง/bin/ls(หรือมากกว่าcommand ls) เพื่อเรียกใช้lsโดยไม่ใช้ตัวเลือกที่มีนามแฝงเพื่อยืนยันว่าเป็นตัวเลือกสีที่สร้างความแตกต่างหรือไม่ FWIW lsจะปิดการระบายสีเมื่อเอาต์พุตเป็นไพพ์หรืออุปกรณ์อื่นที่ไม่ใช่เทอร์มินัล
jw013

3
แบ็กสแลชก่อนที่คำสั่งจะรันแทนที่จะเป็นนามแฝงเช่นกัน \ls
Rob

คำตอบ:


28

หากคุณเรียกใช้ ls ปกติมันจะแสดงรายการของไฟล์โดยไม่จำเป็นต้องเรียกใช้ stat (2) กับไฟล์ใด ๆ กล่าวอีกนัยหนึ่งมันไม่สามารถเข้าถึงไฟล์ได้ด้วยตัวเอง แต่มีเพียงไดเรกทอรีที่มีไฟล์เท่านั้น

หากคุณเพิ่มในตัวเลือก --color หรือใช้ตัวเลือก ls อื่นที่จำเป็นต้องตรวจสอบไฟล์ด้วยตัวเองดังนั้น ls จะต้อง stat (2) ไฟล์เหล่านั้น

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

ตามที่คนอื่นพูดถึงถ้าคุณใช้ strace คุณจะพบว่า ls ไดเรกทอรีใดพยายามที่จะเข้าถึงเมื่อมันหยุดทำงาน จากนั้นคุณสามารถติดตั้งพาร์ติชั่นที่ติดตั้งหรืออะไรก็ได้


ความเป็นไปได้อีกอย่างก็คือไฟล์หนึ่งในไดเรกทอรีของคุณคือ symlink ที่ชี้ไปยังพาร์ติชันบางตัวที่อยู่ห่างไกลและเซิร์ฟเวอร์ที่ไม่ตอบสนอง ... หลักการเดียวกัน
MadScientist

ฉันติดตั้ง nfs จากเซิร์ฟเวอร์ที่ไม่ทำงาน ดูเหมือนว่าสถิติจะค้างอยู่บนเมาท์ nfs คงไม่ยากเกินไปที่จะบอกได้ว่ามันพังหรือไม่และพิมพ์ไดเรกทอรีในสีที่มีการพิมพ์ symlink ที่ชำรุด
Snitse

ที่จริงแล้วมันยาก (สำหรับ ls) เพื่อบอกเซิร์ฟเวอร์ NFS ไม่ทำงาน NFS เป็นระบบไฟล์ประเภทอื่น (เช่น ext3, xfs เป็นต้น) ระบบไฟล์ทั้งหมดจะถูกนำไปใช้ในเคอร์เนล โปรแกรมผู้ใช้เช่น ls (1) เพียงเรียกใช้การเรียกของระบบเช่น stat (2) บนชื่อพา ธ ; ไม่ทราบว่าระบบไฟล์ชนิดใดที่ใช้อยู่ ในกรณีนี้การโทรของระบบจะหยุดทำงาน (ดังนั้นแอพ userspace จะหยุดทำงาน) จนกว่าจะได้ผลลัพธ์ ดังนั้น ls จะถูกพักโดยเคอร์เนลจนกว่าจะได้ผลลัพธ์ ... ซึ่งไม่เคยเกิดขึ้น ดังนั้นฉันจึงไม่สามารถบอกได้ว่ามีอะไรผิดปกติ
MadScientist

ฉันควรจะบอกว่าคุณสามารถเปลี่ยนพฤติกรรมของ NFS ได้ หากคุณระบุ "การติดตั้งอย่างหนัก" เคอร์เนลจะพยายามเชื่อมต่อใหม่ตลอดเวลาหากเซิร์ฟเวอร์หมดเวลาและจะไม่ส่งคืนจากการเรียกของระบบจนกว่าจะเกิดขึ้น หรือคุณสามารถร้องขอ "soft mount" ซึ่งเคอร์เนลจะส่งคืนพร้อมกับความล้มเหลวหากการร้องขอเซิร์ฟเวอร์หมดเวลา อย่างไรก็ตามโปรแกรมส่วนใหญ่ไม่ได้ถูกเขียนขึ้นเพื่อจัดการกับการดำเนินการหมดเวลาเหล่านี้อย่างเหมาะสมดังนั้นการระบุ soft mounts ใน NFS จึงเป็นอันตรายและทำให้ระบบไม่เสถียร ผู้ที่ใช้ NFS ใช้และแนะนำการติดตั้งอย่างสม่ำเสมอเป็นประจำ ดู nfs (5)
MadScientist

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