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.