작은 디렉토리에서 오래 걸리는 LS


21

우분투를 실행하면 터미널을 열고

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가 액세스하려고하는 디렉토리를 찾을 수 있습니다. 그런 다음 마운트 된 파티션 등을 마운트 해제 할 수 있습니다.


또 다른 가능성은 디렉토리의 파일 중 하나가 원격이고 서버가 응답하지 않는 일부 파티션을 가리키는 심볼릭 링크입니다 ...
MadScientist

다운 된 서버에서 nfs를 마운트했습니다. 스탯이 nfs 마운트가 다운되고 있다는 사실이 이상해 보입니다. 다운되었는지 알기 어려워서 깨진 심볼릭 링크가 인쇄 된 색상으로 디렉토리를 인쇄하십시오.
Snitse

실제로 NFS 서버가 다운되었다고 말하는 것은 어렵습니다. NFS는 ext3, xfs 등과 같은 다른 유형의 파일 시스템입니다. 모든 파일 시스템은 커널에서 구현됩니다. ls (1)과 같은 사용자 프로그램은 단순히 경로 이름에서 stat (2)와 같은 시스템 호출을 실행합니다. 어떤 종류의 파일 시스템이 사용되고 있는지 전혀 모릅니다. 이 경우 결과를 얻을 때까지 시스템 호출이 정지됩니다 (따라서 사용자 공간 앱이 정지됨). 따라서 ls는 결과가 얻어 질 때까지 커널에 의해 잠들게됩니다 ... 결코 일어나지 않습니다. 그래서 뭔가 잘못되었다고 말할 수 없습니다.
MadScientist

NFS의 동작을 변경할 수 있다고 말해야합니다. "하드 마운트"를 지정하면 서버 시간이 초과되어 커널이 시스템 호출에서 돌아올 때까지 계속 연결을 시도합니다. 또는 서버 요청 시간이 초과되면 커널이 실패와 함께 반환되는 "소프트 마운트"를 요청할 수 있습니다. 그러나 이러한 유형의 시간 초과 작업을 제대로 처리하기 위해 많은 / 대부분의 프로그램이 작성되지 않았으므로 NFS에서 소프트 마운트를 지정하는 것은 위험하며 시스템이 불안정 해집니다. NFS를 정기적으로 사용하는 사람들은 항상 하드 마운트를 사용하고 권장합니다. nfs (5)를 참조하십시오.
MadScientist

나는했다 sshfs마운트, 그리고 내가 그들을 마운트 해제 수있는 유일한 방법은 관련 죽이는했다 sshsshfs프로세스를.
Gauthier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.