小さなディレクトリで ls に時間がかかる

小さなディレクトリで ls に時間がかかる

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 の出力を色分けすると、なぜこのコマンドがハングするのでしょうか?

答え1

通常通り ls を実行すると、stat(2) を実行する必要もなく、ファイルのリストだけが表示されます。つまり、ファイル自体にはアクセスせず、ファイルを含むディレクトリのみにアクセスします。

--color オプションを追加したり、ファイル自体を調べる必要がある他の ls オプションを使用したりする場合、ls はそれらのファイルを stat(2) する必要があります。

おそらく、ディレクトリ内のファイルの少なくとも 1 つは、NFS などを介してリモート システムからマウントされています。また、そのパーティションをマウントしたサーバーが起動していないか、応答していません。そのため、ls がそのディレクトリに関する情報を取得しようとすると、サーバーが応答するのを待ってカーネル内でハングします。

他の人が言っているように、strace を使用すると、ハングしたときに ls がアクセスしようとしているディレクトリがわかります。その後、マウントされているパーティションなどをアンマウントできます。

関連情報