Butuh waktu lama di direktori kecil

21

Menjalankan Ubuntu, saya membuka terminal dan lakukan

sudo bash
cd /
ls | head -n 1000

Dan diprediksi sekitar 20 direktori dikembalikan.

Namun, jika saya melakukan ls, dan tidak menyalurkannya ke apa pun, ls hanya menggantung di sana sampai saya membunuhnya dari terminal lain. Apa yang mungkin terjadi?

EDIT:

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

EDIT:

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

Mengapa mewarnai keluaran ls menyebabkan perintah ini hang?

Snitse
sumber
3
Jalankan type lsuntuk memeriksa kemungkinan alias dll.
jw013
5
Menjalankan strace lsberpotensi membantu Anda mengidentifikasi masalah. stracemenampilkan semua panggilan sistem yang dibuat oleh program yang dipanggilnya.
Gowtham
2
Coba /bin/ls(atau lebih tepatnya, command ls) untuk berjalan lstanpa opsi alias, untuk mengkonfirmasi apakah atau tidak itu opsi warna yang membuat perbedaan. FWIW, lsmematikan pewarnaan saat outputnya berupa pipa atau perangkat non-terminal lainnya.
jw013
3
backslash sebelum perintah menjalankannya alih-alih alias, juga. \ls
Rob

Jawaban:

28

Jika Anda menjalankan ls secara normal, itu hanya akan menampilkan daftar file tanpa perlu menjalankan stat (2) di antara mereka. Dengan kata lain, itu tidak mengakses FILES sendiri, tetapi hanya direktori yang berisi file.

Jika Anda menambahkan opsi --color, atau menggunakan opsi ls lain yang perlu memeriksa file-file itu sendiri, maka ls perlu memberi stat (2) file-file itu.

Kemungkinan besar setidaknya satu file dalam direktori Anda sebenarnya sedang dipasang dari sistem jarak jauh, melalui NFS atau serupa. Dan server tempat Anda menginstal partisi tersebut tidak aktif atau tidak merespons. Jadi, ketika ls mencoba untuk mendapatkan informasi tentang direktori itu, ia akan menggantung di kernel menunggu server untuk merespons.

Seperti yang telah disebutkan orang lain, jika Anda menggunakan strace Anda akan menemukan direktori mana yang coba diakses ketika hang. Kemudian Anda dapat umount partisi yang dipasang itu atau apa pun.

Ilmuwan gila
sumber
Kemungkinan lain adalah bahwa salah satu file dalam direktori Anda adalah symlink yang menunjuk ke beberapa partisi yang jauh dan yang servernya tidak merespons ... prinsip yang sama.
MadScientist
Saya telah nfs di-mount dari server yang down. Tampaknya aneh bahwa stat hanya menggantung di mount nfs sedang turun. Tidak akan terlalu sulit untuk mengetahui apakah itu turun dan hanya mencetak direktori dalam warna yang rusak karena symlink dicetak.
Snitse
Sebenarnya, ini sulit (untuk ls) untuk memberitahu server NFS sedang down. NFS hanyalah tipe sistem file yang berbeda (seperti ext3, xfs, dll.) Semua sistem file diimplementasikan dalam kernel. Program pengguna seperti ls (1) hanya menjalankan pemanggilan sistem seperti stat (2) pada pathname; tidak tahu sistem file apa yang sedang digunakan. Dalam hal ini panggilan sistem hang (sehingga aplikasi userspace digantung) sampai hasilnya diperoleh. Jadi, ls ditidurkan oleh kernel sampai hasilnya diperoleh ... yang tidak pernah terjadi. Jadi aku tidak bisa mengatakan ada yang salah.
MadScientist
Saya harus mengatakan Anda BISA mengubah perilaku NFS. Jika Anda menentukan "keras mount", maka kernel akan mencoba selamanya untuk menyambung kembali jika server kali keluar dan tidak akan kembali dari system call sampai itu terjadi. Atau Anda dapat meminta "lunak mount", di mana kernel kembali dengan kegagalan jika kali permintaan server keluar. Namun, banyak / sebagian besar program tidak ditulis untuk menangani jenis-jenis operasi timeout ini dengan benar, sehingga menetapkan soft mount di NFS berbahaya dan menyebabkan ketidakstabilan sistem. Mereka yang menggunakan NFS secara teratur hampir selalu menggunakan dan merekomendasikan hard mount. Lihat nfs (5).
MadScientist
Saya memiliki sshfstunggangan, dan satu-satunya cara saya bisa melepasnya adalah dengan membunuh yang terkait sshdan sshfsproses.
Gauthier