다음과 같은 것을 시도해 볼 수 있습니다.
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find는 특정 기준과 일치하는 파일을 찾는 데 사용됩니다.
-mtime +7
7 일이 지난 파일 만 선택합니다 (다른 값을 사용할 수 있음)
-exec fuser -s {} ';'
오래된 기준과 일치하는 모든 파일에 대해 자동 모드로 퓨저를 호출합니다. 퓨저는 지금 액세스 한 모든 파일에 대해 0 (= true)을, 액세스하지 않은 파일에 대해서는 1 (= false)을 반환합니다. 우리는 단지 액세스되지 않은 것들에 관심이있다, 우리는을 넣어 -not
이 앞에-exec
-exec echo {} ';'
기준과 일치하는 모든 파일 이름 만 인쇄합니다. -exec rm {} ';'
여기서 대신 사용하고 싶을 수도 있지만 여전히 사용중인 일부 파일이 삭제 될 수 있으므로 간단한 에코를 먼저 수행하는 것이 더 안전하다고 생각합니다.
- 편집 : 우발적 인 영향을 피하기 위해 정리의 효과를 특정 파일 패턴 또는 사용자 ID로 제한
-name 'foo*.bar'
하거나 -uid 123
제한하는 것을 원할 수 있습니다 .
마지막으로 : 한 번만 (예 : 시스템 부팅시) 작성되지만 자주 읽는 파일 (예 : X- 세션 쿠키)이있을 수 있습니다. 따라서 결함이있는 프로그램으로 만든 파일에만 영향을 줄 수 있도록 이름 확인을 추가하는 것이 좋습니다.
edit2 :
마지막 질문 : 프로세스가 열려있는 핸들을 갖지 않을 때까지 (적어도 기본 Linux 파일 시스템의 경우) 파일이 디스크에서 삭제되지 않습니다. 문제는 디렉토리 항목이 즉시 제거된다는 것입니다. 즉, 파일을 제거 할 때부터 파일 이름이 없기 때문에 새 프로세스가 더 이상 파일을 열 수 없습니다.
자세한 내용은 /programming/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux 를 참조하십시오.
edit3 : 그러나 전체 프로세스를 자동화하려면 어떻게해야합니까?
내가 말했듯이 한 번 작성된 다음 한 번에 한 번씩 읽는 파일이있을 수 있습니다 (예 : X 세션 쿠키, PID 파일 등). 이것들은이 작은 제거 스크립트에 의해 제외되지 않을 것입니다 (이것은 echo
실제로 파일을 삭제하기 전에 먼저 테스트 실행을 원할 수있는 이유입니다 ).
안전한 솔루션을 구현하는 한 가지 방법은을 사용하는 것 atime
입니다.
atime
각 파일이 마지막으로 액세스 된 시간을 저장합니다. 그러나 해당 파일 시스템 옵션은 성능에 약간의 영향을 미치기 때문에 종종 비활성화됩니다 ( 20-30 % 지역 의이 블로그 에 따르면 ). 이 relatime
있지만 액세스 시간 mtime
이 변경된 경우에만 액세스 시간을 기록 하므로 도움이되지 않습니다.
을 사용 하려면 전체 시스템에 대한 성능 영향이 너무 크지 않도록 별도의 파티션 (이상적으로는 램 디스크) 을 사용하는 atime
것이 좋습니다 /tmp
.
atime
활성화 되면 -mtime
위 명령 줄 의 매개 변수를로 바꾸면됩니다 -atime
.
을 제거 할 수는 -not -exec fuser -s {} ';'
있지만 응용 프로그램이 파일을 오랫동안 열어 두는 경우를 대비하여 그대로 유지합니다.
그러나 echo
시스템에서 여전히 필요한 것을 제거하기 전에 명령을 사용하여 테스트하십시오 !