ls를 실행할 때이 파일이 숨겨진 이유는 무엇입니까?


10

편집 : 나는이 스레드에 대해 완전히 잊어 버렸습니다. 하드 디스크에 문제가있는 것 같습니다. 우리는 다른 요구를 위해이 서버를 재배치해야했기 때문에 마침내 하나의 불량 디스크를 교체 할 수있게되었습니다.

몇 주 동안이 특정 파일을 삭제할 수없는 이유를 알 수 없었습니다. 루트로 할 수는 있지만 쉘 스크립트는 다른 사용자로 실행됩니다. 그래서 ls -la를 실행하면 거기에 없습니다. 그러나 매개 변수로 호출하면 나타납니다! 물론 소유자는 루트이므로 삭제할 수 없습니다.

6535가 누락되었습니다 ...

[root@server]# ls -la 653*
-rw-rw-r--  1 svn svn  24002 Mar 26 01:00 653
-rw-rw-r--  1 svn svn   7114 Mar 26 01:01 6530
-rw-rw-r--  1 svn svn   8653 Mar 26 01:01 6531
-rw-rw-r--  1 svn svn   6836 Mar 26 01:01 6532
-rw-rw-r--  1 svn svn   3308 Mar 26 01:01 6533
-rw-rw-r--  1 svn svn   3918 Mar 26 01:01 6534
-rw-rw-r--  1 svn svn   3237 Mar 26 01:01 6536
-rw-rw-r--  1 svn svn   3195 Mar 26 01:01 6537
-rw-rw-r--  1 svn svn  27725 Mar 26 01:01 6538
-rw-rw-r--  1 svn svn 263473 Mar 26 01:01 6539

이제 직접 호출하면 나타납니다.

[root@server]# ls -la 6535
-rw-rw-r--  1 root root 3486 Mar 26 01:01 6535

흥미로운 점이 있습니다. 그래서 쉘 스크립트에서 6535가 루트 소유이기 때문에 삭제하지 못하기 때문에이 문제가 발생했습니다. "rm -rf"를 실행하면 실제로 파일이 표시됩니다. 이전에 시도했지만 디렉토리가 비어 있지 않다고 말했기 때문에 디렉토리를 제거하지 못했습니다. 나는 들어가서 충분히 보았고 파일 "6535"가 마침내 나타납니다. 왜이 일을하는지 모르겠습니다.

strace는 다음과 같이 말합니다.

#strace ls -la 653* 2>&1 | grep ^open

open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib64/tls/librt.so.1", O_RDONLY) = 3
open("/lib64/libacl.so.1", O_RDONLY)    = 3
open("/lib64/libselinux.so.1", O_RDONLY) = 3
open("/lib64/tls/libc.so.6", O_RDONLY)  = 3
open("/lib64/tls/libpthread.so.0", O_RDONLY) = 3
open("/lib64/libattr.so.1", O_RDONLY)   = 3
open("/etc/selinux/config", O_RDONLY)   = 3
open("/proc/mounts", O_RDONLY)          = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open("/proc/filesystems", O_RDONLY)     = 3
open("/usr/share/locale/locale.alias", O_RDONLY) = 3
open("/usr/share/locale/en_US.UTF-8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US.utf8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.UTF-8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.utf8/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/nsswitch.conf", O_RDONLY)    = 3
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib64/libnss_files.so.2", O_RDONLY) = 3
open("/etc/passwd", O_RDONLY)           = 3
open("/etc/group", O_RDONLY)            = 3
open("/etc/mtab", O_RDONLY)             = 3
open("/proc/meminfo", O_RDONLY)         = 3
open("/etc/localtime", O_RDONLY)        = 3

2
이것을 알아 차리면 업데이트를 게시하십시오.
— einstiien

흥미 롭군 ls -ab로 무엇이보고됩니까? 8 진수가 아닌 이상한 문자가 파일 이름에 있습니까? 나는 어쨌든 그것을 나열 할 것이라고 생각하지만 확실하지 않습니다.
— egorgry

1
최근에 fsck를 실행 했습니까? 파일 시스템에 문제가있는 것이 원격으로 가능합니다.
— Zoredache

내일 다시 시험해 봐야겠다.
— luckytaxi

답변:


7

조금 걱정 스럽다. ls알려진 양호한 파일과 비교 하여 파일이 수정되지 않았 음을 확인했습니다 . 배포판의 패키지 도구를 사용하여 격리 된 시스템에서 파일을 확인할 수 있습니다.


+1 : ls -al은 모든 것을 보여 주어야합니다. 그렇지 않으면 어딘가에 문제가있는 것입니다.
— Satanicpuppy

2
그것은 그 확실히 가능 ls가능성, 6535. 특정의 PID를 숨기기 위해 수정되었습니다
— MikeyB

아니 ... 아무것도 ...
— luckytaxi

6

때때로 파일 이름은 커서 이동 시퀀스와 같이 이상한 문자를 얻습니다. 다음을 확인하십시오.

ls -lq

제어 문자 대신 물음표를 표시해야합니다 (기본값 일 수도 있지만 아닐 수도 있음).

이것은 부분적으로 존재할 수있는 문제의 유형을 보여줍니다.

touch A C
touch B$(tput cuu1)$'\r'
ls -l
ls -lq
ls -l --show-control-chars    # for systems that have that option and default to -q

나는 또한 시도 할 것이다 :

type -a ls
alias ls
declare -f ls
md5sum /bin/ls    # compare to a known-good identical system

별명 또는 함수가 정의되어 있는지 또는 2 진이 이상한 곳에 있는지 또는 수정되었는지 확인하십시오.


1
통찰력 +1 ls수정 된 경우 md5sum시스템의 시스템도 수정되었을 수 있습니다. 결정적인 결론에 도달하려면 검증 된 정상 환경이 필요합니다.
— 워너

'md5 파일'과 같은 작업을 수행하면 md5가 가짜 결과를 생성하도록 변경되었지만 bzip2 <file | MD5와 비교 그것을 다른 곳에서 같은 명령.
— chris


2

'ls'가 수정되었다고 생각되면 일반적으로 이와 같은 작업을 수행합니다 ...

python -c "import os; print os.listdir('.')"

물론 Python, C 라이브러리, 커널 또는 파일 시스템 도 수정할 수 있지만 일반적으로 쉘 유틸리티 일뿐입니다.


2
또는 쉘의 파일 이름 확장을 사용하여 디렉토리를 읽을 수 있습니다-echo * (및 원하는 경우 echo *. *)
— chris

*.*문자 뒤에 점과 문자가있는 파일 만 표시합니다. 이것은 * nix 시스템의 모든 것이 아닙니다. echo가 하나의 명령으로 모든 것을 보여줄지 확신하지 못합니다.echo * && echo .*
— einstiien

4
자세히 살펴보면 * (공백). *가 아니라 *. *입니다. 문장 부호는이 주석 시스템에 적합하지 않습니다. 당신은 그것을 먹이에 관심이 있습니다. 부울 &&는 필요하지 않거나 실제로는 의미가 없습니다. 왜냐하면 &&는 부울 이며 echo 명령이 항상 성공하기 때문에 항상 작동합니다.
— chris mar

@ chris : 내 나쁜, 정말보기 어렵다.
— einstiien

2

strace를 사용하여 ls가 수행하는 작업을 정확하게 조사 할 수 있으며 해당 파일 이름을 표시하지 않는 이유를 알 수 있습니다.

strace ls -la 653* 2>&1 | less

그것을 통해 그것을보고 무슨 일이 일어나고 있는지보십시오.

strace ls -la 653* 2>&1 | grep ^open

결과는 다음과 같습니다.

open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/librt.so.1", O_RDONLY)       = 3
open("/lib/libacl.so.1", O_RDONLY)      = 3
open("/lib/libselinux.so.1", O_RDONLY)  = 3
open("/lib/libc.so.6", O_RDONLY)        = 3
open("/lib/libpthread.so.0", O_RDONLY)  = 3
open("/lib/libattr.so.1", O_RDONLY)     = 3
open("/lib/libdl.so.2", O_RDONLY)       = 3
open("/lib/libsepol.so.1", O_RDONLY)    = 3
open("/etc/selinux/config", O_RDONLY|O_LARGEFILE) = 3
open("/proc/mounts", O_RDONLY|O_LARGEFILE) = 3
open("/selinux/mls", O_RDONLY|O_LARGEFILE) = 3

그리고 당신이 같은 것을 본다면

open("/var/tmp/.../H@ckl1st", O_RDONLY) = 3

조심하십시오, 당신은 0 소유되었습니다 ...

이것은 결정적인 테스트는 아니지만 좋은 지표입니다 ...

(Solaris 또는 다른 OS를 사용하는 경우 트러스 또는 strace 대신 다른 유사한 유틸리티를 사용해야 할 수도 있습니다)

(csh / tcsh 파생 쉘을 사용하는 경우 다른 방향 재 지정 명령문이 필요할 수 있습니다)


나는 이것을 좋아한다. 이 strace유틸리티는 실제로 스위스 군용 칼입니다. 시스템 호출 수준으로 바로 가서 임의의 복잡한 문제를 우회하십시오. 시스템 관리자가 가장 먼저하는 일 중 하나입니다. 한푼의 가치는 새로 설치된 기계에 버려야합니다.
— McJeff

예. 시스템 관리자에게 가장 유용한 두 가지 도구는 트러스 / strace 및 tcpdump입니다. 이것으로, 당신은 항상 무언가를 기대하고 있거나 행동하지 않을 때 wtf가 진행되고 있는지 볼 수 있습니다.
— chris

2

빠른 업데이트, 다른 이유로 서버를 교체해야했습니다. 파일 시스템이었습니다. 모든 것이 잘되었습니다! 모두 감사합니다.


파일 시스템이 망가졌고 이것이 엉뚱한 증상 이었습니까?
— chris

그렇습니다.
— luckytaxi

아래 목록에 해결책이 있다고 말하는 편집에 갇혀 있었을 수도 있습니다. 왜냐하면 다른 답변 아래에 묻혀 있고 문제 해결에 유용하기 때문입니다.
— Bart Silverstrim

0

핵 이론은 흥미롭지 만 대안적인 이론이 있습니다. 유닉스 파일 삭제 시맨틱은 모든 프로세스가 그것을 가리키는 열린 파일 핸들을 닫을 때까지 파일을 유지합니다. 누군가가 SVN 체크 아웃 / 커밋을 일시 중지했거나 서버 스레드가 중단되었을 수 있습니다. SVN 프로세스 (또는 Apache)를 다시 시작하면 문제가 해결되면 여기서 책임을 져야합니다.

아마도이 파일을 여전히 사용하여 프로세스를 식별 할 수 lsof | grep 6535있습니까?


그래 lsof는 아무 것도 보여주지 않았다. 흥미로운 것은 6535도 소스에서 "누락"입니다. 내 스크립트는 원본 리포지토리를 다른 디렉토리로 핫 카피합니다. 어떤 이유로이 특정 파일을 삭제할 수없는 문제가 발생했을 때입니다.
— luckytaxi

삭제되었지만 열린 파일은 디렉토리 항목이 삭제되면 디렉토리 항목이 존재하지 않아 디렉토리 가 비어 있기 때문에 포함 디렉토리를 삭제하지 못하게합니다 . 파일을 연 프로세스가 종료 될 때까지 파일에서 공간을 다시 확보 할 수 없지만 해당 파일이있는 디렉토리는 이제 삭제할 수 있습니다.
— chris

당신의 대체 이론은 흥미 롭습니다. 성공적으로 제거하면 하드 링크가 즉시 제거됩니다. inode에는 여전히 데이터가 포함되어 있으며 일부 파일 핸들은 메모리에 캐시되어있을 수 있지만이 시나리오에서는 설명 된 동작을 설명 할 수 없습니다. 또는 크리스가 말한 것.
— Warner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.