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)해야 합니다.
아마도 디렉터리에 있는 파일 중 적어도 하나는 실제로 NFS 또는 이와 유사한 것을 통해 원격 시스템에서 마운트되었을 것입니다. 그리고 파티션을 마운트한 서버가 시작되지 않거나 응답하지 않습니다. 따라서 ls가 디렉토리에 대한 정보를 얻으려고 시도하면 서버가 응답할 때까지 커널에서 정지됩니다.
다른 사람들이 언급했듯이 strace를 사용하면 ls가 정지되었을 때 어떤 디렉토리에 액세스하려고 하는지 알아낼 수 있습니다. 그런 다음 마운트된 파티션 등을 마운트 해제할 수 있습니다.