안녕하세요. 삭제된 파일이 여러개 있는데 어떤 이유에서인지 디스크 공간을 차지하고 있던 파일의 프로세스를 명시적으로 종료할 때까지 삭제된 파일과 관련된 디스크 공간을 사용할 수 없습니다.
$ lsof /tmp/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cron 1623 root 5u REG 0,21 0 395919638 /tmp/tmpfPagTZ4 (deleted)
위에서 삭제한 파일이 차지하는 디스크 공간으로 인해 Tab 키를 사용하여 파일 경로 자동 완성을 시도할 때 오류가 발생하는 등의 문제가 발생할 수 있습니다.bash: cannot create temp file for here-document: No space left on device
그러나 해당 PID에 대한 공간을 실행한 후에는 kill -9 1623
해당 PID에 대한 공간이 해제되고 더 이상 오류가 발생하지 않습니다.
내 질문은 다음과 같습니다
- 파일을 처음 삭제할 때 해당 공간이 즉시 해제되지 않는 이유는 무엇입니까?
- 삭제된 파일과 관련된 파일 공간을 복구하는 가장 좋은 방법은 무엇입니까?
제가 사용한 잘못된 용어나 이 상황과 관련된 기타 정보가 있으면 알려주시기 바랍니다.
답변1
unice에서 파일 이름은 파일이 있는 메모리(하드 드라이브 또는 RAM 지원 파일 시스템일 수 있음)에 대한 포인터(인덱스 노드)일 뿐입니다. 각 파일은 자신을 가리키는 링크 수를 추적합니다. 링크는 파일 이름(동일한 파일에 대한 하드 링크가 여러 개 있는 경우 복수형)일 수 있으며, 파일이 열릴 때마다 프로세스는 실제로 "링크"를 저장합니다. " 같은 공간으로 .
공간은 링크가 남아 있지 않은 경우에만 물리적으로 해제됩니다(따라서 해당 공간에 도달할 수 없습니다). 이것이 유일하게 합리적인 옵션입니다. 파일을 사용하는 동안 다른 사람이 더 이상 파일에 액세스할 수 없어도 상관없습니다. 파일을 사용하고 있으며 파일을 닫을 때까지 계속 제어할 수 있습니다. 파일 이름이 사라지거나 이동하거나 다른 것을 확인하십시오. 이는 임시 파일에도 적용됩니다. 일부 구현에서는 파일을 생성하고 즉시 연결을 해제하므로 파일 시스템에는 표시되지 않지만 파일을 생성한 프로세스에서는 해당 파일을 정상적으로 사용하고 있습니다. Flash 플러그인은 특히 이 접근 방식을 선호합니다. 다운로드한 모든 비디오 파일은 열려 있지만 파일 시스템에서는 해당 파일을 표시하지 않습니다.
따라서 대답은 프로세스에서 여전히 파일이 열려 있는 동안에는해서는 안 된다공간을 되찾길 바랍니다. 출시되지는 않았지만 적극적으로 사용됩니다. 이것이 응용 프로그램이 파일 사용을 마친 후 실제로 파일을 닫아야 하는 이유 중 하나입니다. 일반적인 사용에서는 해당 공간을 여유 공간으로 간주해서는 안 되며 일반적이어서도 안 됩니다. 의도적으로 링크를 해제한 임시 파일을 제외하면 사용되지 않은 것으로 간주하고 싶지만 여전히 열려 있는 파일이 실제로 있어서는 안 됩니다. 이 작업을 자주 수행하는 프로세스가 있는지 확인하고 어떻게 사용되는지 고려하거나 더 많은 공간을 찾아보세요.
답변2
파일이 파일 시스템에서 제거되고 이 inode에 대한 모든 참조가 삭제됩니다. 참조는 디스크(모든 디렉토리에 링크됨)에 있을 수 있으며 열려 있는 애플리케이션에서도 가능합니다. 파일을 삭제하면 디스크에서만 참조가 제거되지만 애플리케이션에는 여전히 참조가 남아 있습니다.
다음 두 가지 방법으로 공간을 "확보"할 수 있습니다.
- 위에서 언급했듯이 파일을 여는 응용 프로그램을 종료할 수 있습니다.
- 파일을 자를 수 있습니다. 삭제된 경우에도:
pid를 알고 있는 경우 이 pid로 어떤 파일이 열리는지 확인하십시오. ls -l /proc/PID/fd 여기에 다음 링크가 표시됩니다.
undefine@uml:~$ ls -l /proc/18596/fd 라젬 0 lrwx------ 1 정의 취소 정의 취소 64 lut 1 00:06 0 -> /dev/pts/30 lrwx------ 1 정의 취소 정의 취소 64 lut 1 00:06 1 -> /dev/pts/30 lrwx------ 1 정의 취소 정의 취소 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 정의 취소 정의 취소 64 lut 1 00:06 4 -> anon_inode:inotify
보시다시피 3개의 fd가 삭제되었습니다. 예를 들어 다음 명령을 통해 잘라낼 수 있습니다.
undefine@uml:~$ :>/proc/18596/fd/3 @uml:~$ 정의 해제
애플리케이션이 이 파일에서 데이터를 읽는 경우 애플리케이션에 위험할 수 있다는 점을 명심하세요. 하지만 로그 파일일 경우에는 안전하게 잘라낼 수 있습니다.
답변3
다른 사람들이 말했듯이, lsof
열린 파일 설명자로 인해 디스크에 아직 남아 있는 삭제된 모든 파일을 나열하는 데 사용할 수 있습니다. 그러나 이는 긴 목록이 될 수 있습니다. 다음 명령은 이러한 파일을 바이트 크기의 오름차순으로 나열합니다.
sudo lsof -F sn0 | tr -d '\000' | grep deleted | sed 's/^[a-z]*\([0-9]*\)n/\1 /' | sort -n
이 작업을 수행하는 더 깔끔한 방법이 있을 수 있지만 위 명령이 저에게 효과적입니다.
답변4
다음 명령을 사용해보십시오
lsof | grep deleted
그런 다음 삭제된 파일의 pid를 종료합니다.