디렉토리에서 프로그램을 시작했는데 실수로 디렉토리와 그 안의 프로그램을 삭제했습니다. 프로그램은 여러 출력 파일을 생성합니다. 프로그램이 아직 실행 중입니다. 동일한 디렉토리를 생성하면 프로그램이 여전히 해당 디렉토리에 출력 파일을 생성하는지 알고 싶습니다. 그게 가능합니까?
답변1
파일 항목이 파일 시스템에서 삭제되면 다시 생성할 수 없습니다. 이전 디렉토리의 이름으로 새 디렉토리를 생성하면 새 디렉토리가 됩니다. 이러한 파일은 마술처럼 다시 나타나지 않습니다.
Unix(Linux 포함) 파일 시스템의 작동 원리는 파일의 모든 정보를 포함하는 inode를 통해 작업하는 것입니다.와는 별개로그것의 이름. 디렉토리에서 항목은 이름과 내용에 대한 유일한 연결인 inode 번호로 구성됩니다. ln
완전히 다른 파일 이름을 사용하여 파일에 대한 또 다른 링크를 만들 수 있습니다 .
파일이 삭제되면 해당 참조 횟수가 감소합니다. 0에 도달하면 파일이 실제로 삭제됩니다(파일이 차지한 공간은 여유 블록 풀로 반환되고 inode는 지워짐). 그러나 프로세스가 여전히 파일을 열어두고 참조 횟수가 0에 도달하지 않는 한 파일은 여전히 존재합니다.
Linux에서는 의사 파일 시스템을 통해 프로세스에서 열린 파일을 사용할 수 있습니다 /proc/
. 프로세스의 프로세스 ID(pid)를 알고 있는 경우 /proc/pid/fd/에서 열려 있는 파일 목록을 찾습니다. 예를 들어 프로세스의 경우 apache
약어 목록은 다음과 같습니다.
$ sudo ls -l /proc/32704/fd
total 0
lr-x------ 1 root root 64 Nov 20 02:39 0 -> /dev/null
l-wx------ 1 root root 64 Nov 20 02:39 1 -> /dev/null
lr-x------ 1 root root 64 Nov 20 02:39 10 -> /dev/random
lrwx------ 1 root root 64 Nov 20 02:39 11 -> /tmp/.ZendSem.6DE1g1 (deleted)
lrwx------ 1 root root 64 Nov 20 02:39 12 -> anon_inode:[eventpoll]
l-wx------ 1 root root 64 Nov 20 02:39 2 -> /var/log/apache2/error.log
여기에 추가된 행을 참고하십시오 (deleted)
. Apache는 다른 사람이 접근할 수 없는 임시 파일에 대해 이를 사용합니다. 파일을 생성하고 연 다음 링크를 해제(제거)합니다. 그러나 여전히 이를 사용할 수 있으며, 열린 파일을 상속하므로 Apache의 하위 프로세스도 이를 사용할 수 있습니다.
귀하의 경우에는 삭제된 파일도 찾을 수 있어야 합니다. /proc 항목을 통해 프로세스가 실행되는 동안 "삭제된" 파일을 안전한 장소에 복사할 수 있습니다.
sudo cp /proc/pid/fd/x $HOME/somewheresafe/filename