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)를 실행할 필요 없이 파일 목록만 표시됩니다. 즉, FILES 자체에는 액세스하지 않고 파일이 포함된 디렉터리에만 액세스합니다.
--color 옵션을 추가하거나 파일 자체를 검사해야 하는 다른 ls 옵션을 사용하는 경우 ls는 해당 파일을 stat(2)해야 합니다.
디렉터리에 있는 파일 중 적어도 하나가 실제로 NFS 또는 이와 유사한 것을 통해 원격 시스템에서 마운트되고 있을 가능성이 높습니다. 그리고 해당 파티션을 마운트한 서버가 작동하지 않거나 응답하지 않습니다. 따라서 ls가 해당 디렉토리에 대한 정보를 얻으려고 시도하면 서버가 응답할 때까지 커널에서 정지됩니다.
다른 사람들이 언급했듯이 strace를 사용하면 ls가 정지되었을 때 어떤 디렉토리에 액세스하려고 하는지 알 수 있습니다. 그런 다음 마운트된 파티션 등을 마운트 해제할 수 있습니다.