열려있는 삭제 된 파일에서 디스크 공간을 확보하는 가장 좋은 방법


28

안녕하세요 삭제 된 파일이 많이 있지만 어떤 이유로 디스크 공간을 차지하는 파일의 프로세스를 명시 적으로 종료 할 때까지 삭제 된 파일과 관련된 디스크 공간을 사용할 수 없습니다

$ lsof /tmp/
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)

위의 삭제 된 파일이 차지하는 디스크 공간으로 인해 탭 키를 사용하여 파일 경로를 자동 완성하려고 할 때와 같은 문제가 발생합니다. 오류가 발생합니다. bash: cannot create temp file for here-document: No space left on device

그러나 kill -9 1623그 PID를위한 공간을 확보 한 후 PID가 해제되고 더 이상 오류가 발생하지 않습니다.

내 질문은 :

  • 파일이 처음 삭제 될 때이 공간이 즉시 해제되지 않는 이유는 무엇입니까?
  • 삭제 된 파일과 관련된 파일 공간을 다시 얻는 가장 좋은 방법은 무엇입니까?

이 상황과 관련하여 내가 사용한 잘못된 용어 나 기타 관련 정보를 알려주십시오.

답변:


26

유니 세에서 파일 이름은 파일이있는 메모리 (하드 드라이브 또는 RAM 백업 파일 시스템 일 수 있음)를 가리키는 포인터 (아이 노드) 일뿐입니다. 각 파일에는 링크 수를 기록합니다. 링크는 파일 이름 (동일한 파일에 대한 여러 개의 하드 링크가있는 경우 복수) 일 수 있으며 파일을 열 때마다 프로세스는 실제로 "링크"를 같은 공간.

링크가 남아 있지 않은 경우에만 공간이 물리적으로 해제됩니다 (따라서 공간에 도달 할 수 없음). 파일을 사용하는 동안 다른 사람이 더 이상 파일에 액세스 할 수없는 경우 중요하지 않습니다. 파일을 사용하고 닫을 때까지 파일을 계속 제어 할 수 있습니다. 파일 이름도 눈에 띄지 않습니다. 사라지거나 움직이거나 임시 파일에도 사용됩니다. 일부 구현에서는 파일을 만들고 즉시 연결을 해제하므로 파일 시스템에 표시되지 않지만 파일을 만든 프로세스는 파일을 정상적으로 사용합니다. 플래시 플러그인은이 방법을 특히 좋아합니다. 다운로드 한 모든 비디오 파일은 열린 상태로 유지되지만 파일 시스템에는 표시되지 않습니다.

따라서 프로세스는 파일을 계속 열어 놓았지만 공간을 되 찾을 것으로 기 대해서는 안됩니다 . 해방되지 않고 적극적으로 사용되고 있습니다. 응용 프로그램이 파일 사용을 마치면 파일을 실제로 닫아야하는 이유 중 하나이기도합니다. 일반적인 사용법에서, 그 공간을 여유 공간으로 생각해서는 안되며, 이것은 또한 매우 일반적이어서는 안됩니다-의도적으로 연결 해제 된 임시 파일을 제외하고는 실제로는 어떤 파일도 존재해서는 안됩니다 사용하지 않는 것을 고려하지만 여전히 열려 있습니다. 이 작업을 많이 수행하는 프로세스가 있는지 검토하고 사용 방법을 고려하거나 더 많은 공간을 찾으십시오.


24

이 inode에 대한 참조가 삭제 된 파일 시스템에서 파일이 삭제됩니다. 디스크 (모든 디렉토리의 링크) 및 열려있는 응용 프로그램에서 참조 할 수 있습니다. 파일을 제거하면 디스크에서 참조 만 삭제되지만 여전히 응용 프로그램에서 참조가 있습니다.

그런 다음 두 가지 방법으로 공간을 "비울 수"있습니다.

  1. 위에서 언급했듯이-파일을 여는 응용 프로그램을 종료 할 수 있습니다.
  2. 파일을자를 수 있습니다. 삭제 된 경우에도 :

pid를 알고 있다면-이 pid가 여는 파일을 확인하십시오. ls -l / proc / PID / fd 다음과 같은 링크가 표시됩니다.

undefine @ uml : ~ $ ls -l / proc / 18596 / fd
razem 0
lrwx ------ 1 undefine undefine 64 lut 1 00:06 0-> / dev / pts / 30
lrwx ------ 1 undefine undefine 64 lut 1 00:06 1-> / dev / pts / 30
lrwx ------ 1 undefine undefine 64 lut 1 00:05 2-> / dev / pts / 30
lr-x ------ 1 undefine undefine 64 lut 1 00:06 3-> / home / undefine / x (삭제됨)
lr-x ------ 1 undefine undefine 64 lut 1 00:06 4-> anon_inode : inotify

보시다시피-3 fd가 삭제됩니다. 다음과 같은 명령으로자를 수 있습니다 :

undefine @ uml : ~ $ :> / proc / 18596 / fd / 3
undefine @ uml : ~ $ 

응용 프로그램에서이 파일을 읽는 경우 위험 할 수 있습니다. 그러나 로그 파일 인 경우 안전하게자를 수 있습니다.


참고 (이 말을 기대 경우) 파일을 절단, 원래의 프로세스가 APPEND 끝으로 아직도 수 있습니다 들고입니다. 결과는 거대해 보이지만 디스크의 공간을 덜 차지하는 스파 스 파일 (파일 시스템이 스파 스 파일을 지원하는 경우)이 계속 커지고 있습니다!
törzsmókus

예. 파일에 쓰면 디스크에서 발생합니다. 디스크에 쓰는 응용 프로그램을 중지하지 않고 피하는 것은 어렵습니다.;)
정의되지 않음

8

다른 사람들이 말했듯 lsof이 열린 파일 설명 자로 인해 여전히 디스크에있는 모든 삭제 된 파일을 나열하는 데 사용할 수 있습니다. 그러나 이것은 매우 긴 목록 일 수 있습니다. 다음은 바이트 단위로 오름차순으로 정렬 된 파일을 나열하는 명령입니다.

sudo lsof -F sn0 | tr -d '\000' | grep deleted | sed 's/^[a-z]*\([0-9]*\)n/\1 /' | sort -n

이것을하는 간결한 방법이있을 수 있지만 위의 명령이 저에게 효과적이었습니다.


5

실행중인 프로세스에 방금 삭제 한 파일에 대한 열린 파일 핸들이 있기 때문에 공간이 즉시 해제되지 않습니다. 결국 프로세스가 여전히 파일을 사용하려고하면 커널이 파일을 제거하기를 원하지 않을 것입니다. 프로세스가 약간 화나게 만들 수 있습니다. 공간을 확보하는 가장 좋은 (그리고 내가 아는 한) 유일한 방법은 당신이 한 일을하는 것입니다-프로세스를 죽이십시오.


프로세스가 여전히 파일을 사용하고 있다면 유닉스가 파일을 제거하려고 시도해서는 안된다는 것입니다.
Bratchley

좋은 지적. 나는 그것을 대답에 추가했습니다.
John

-1

(민트 17.1)

TL; DR :

  • sudo baobab(디스크 사용량 분석기)를 점검하십시오 .
  • 클리어 root사용자의 쓰레기.

문맥

끊임없이 파일을 삭제하는 동안 공간이 줄어 들었습니다. trash-cli휴지통을 비우기 위해 패키지를 설치 했지만 도움이되지 않았습니다. 마지막으로 baobab디스크 공간 구조를 검사하기 위해 (최소한 Mint 17.1에서는 GUI의 디스크 사용량 분석기)를 실행하면 일부 폴더에 액세스 할 수 없다는 경고가 표시됩니다. 그래서을 root사용하여 실행했습니다 sudo baobab. 이것은 문제를 드러냈다. 삭제 된 많은 파일이 root내 사용자가 아닌 사용자 의 휴지통에있었습니다 . 따라서 공간을 확보 할 수 없었습니다. 그런 다음 루트 ( sudo trash-cli) 로 휴지통을 비우고 모든 공간이 반환되었습니다.


-1

아래 명령을 사용해보십시오

lsof | grep deleted

그런 다음 삭제 된 파일의 pid를 죽입니다.


OP는 그 거리를 멀었다. 이것은 그들의 질문에 대답하지 않습니다.
Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.