Linux에서 tmp 폴더를 안전하게 정리하는 방법

Linux에서 tmp 폴더를 안전하게 정리하는 방법

정확히 말하면 tmpfs /tmp, 2GB에 RAM을 사용합니다. 일반적으로 이것으로 충분하지만 때로는 프로세스가 거기에 파일을 생성하고 자체적으로 정리하지 못하는 경우가 있습니다. 충돌이 발생하면 이런 일이 발생할 수 있습니다. 이러한 분리된 tmp 파일을 삭제해야 합니다. 그렇지 않으면 향후 프로세스에 /tmp 공간이 부족해집니다.

/tmp를 어떻게 안전하게 가비지 수집할 수 있나요? 어떤 사람들은 마지막 수정 타임스탬프를 확인하여 이를 수행하지만, 해당 파일이 여전히 필요한 장기 실행 프로세스가 있을 수 있으므로 이 접근 방식은 안전하지 않습니다. 더 안전한 접근 방식은 마지막 수정 타임스탬프 조건과 해당 파일에 대한 파일 핸들이 없는 프로세스가 없다는 조건을 결합하는 것입니다. 이 접근 방식이나 안전하면서도 다른 접근 방식을 구현하는 프로그램/스크립트/등이 있습니까?

덧붙여서, Linux/Unix에서는 충돌로 인해 생성된 파일이 생성 프로세스가 종료되면 삭제되는 생성과 함께 파일 열기 모드를 허용합니까?

답변1

다음과 같은 것을 시도해 볼 수도 있습니다.

find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'

find는 특정 기준과 일치하는 파일을 찾는 데 사용됩니다.

  • -mtime +77일보다 오래된 파일만 선택합니다(다른 값을 사용할 수 있음).
  • -exec fuser -s {} ';'오래된 기준과 일치하는 모든 파일에 대해 자동 모드로 퓨저를 호출합니다. 퓨저는 현재 액세스된 모든 파일에 대해 0(=true)을 반환하고 액세스되지 않은 파일에 대해서는 1(= false)을 반환합니다. 우리는 접근되지 않은 것들에만 관심이 있으므로 -not이 앞에 를 붙입니다.-exec
  • -exec echo {} ';'기준에 일치하는 모든 파일 이름을 인쇄합니다. 여기서 대신 사용하고 싶을 수도 있지만 -exec rm {} ';'아직 사용 중인 일부 파일이 삭제될 수 있으므로 먼저 간단한 에코를 수행하는 것이 더 안전하다고 생각합니다.
  • 편집하다:우발적인 영향을 피하기 위해 정리 효과를 특정 파일 패턴이나 사용자 ID로 제한하거나 -name 'foo*.bar'추가 할 수 있습니다 .-uid 123

마지막 요점: 한 번만 작성되지만(예: 시스템 부팅 시) 자주 읽는 파일(예: X-session-cookie)이 있을 수 있다는 점을 고려하십시오. 따라서 잘못된 프로그램에서 생성된 파일에만 영향을 미치도록 몇 가지 이름 확인을 추가하는 것이 좋습니다.

편집2: 마지막 질문에 대해 : 프로세스에 열린 핸들이 없을 때까지 (적어도 기본 Linux 파일 시스템의 경우) 파일은 디스크에서 삭제되지 않습니다. 문제는 디렉토리 항목이 즉시 제거된다는 것입니다. 이는 파일을 제거한 시점부터 더 이상 새로운 프로세스가 파일을 열 수 없음을 의미합니다(파일 이름이 첨부되지 않았기 때문입니다).

자세한 내용은 다음을 참조하세요. https://stackoverflow.com/questions/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux

편집3:하지만 전체 프로세스를 자동화하고 싶다면 어떻게 해야 할까요?

내가 말했듯이, 한 번 작성되고 가끔씩 읽는 파일이 있을 수 있습니다(예: X 세션 쿠키, PID 파일 등). 이 작은 제거 스크립트에서는 이러한 항목이 제외되지 않습니다(이것이 실제로 파일을 삭제하기 전에 먼저 테스트 실행을 수행하려는 이유입니다 echo).

안전한 솔루션을 구현하는 한 가지 방법은 atime.
atime각 파일에 마지막으로 액세스한 시간을 저장합니다. 그러나 해당 파일 시스템 옵션은 성능에 상당한 영향을 미치기 때문에 비활성화되는 경우가 많습니다(에 따르면).이 블로그20~30% 지역 어딘가). 가 있지만 relatime그 사람은 변경된 경우에만 액세스 시간을 기록하므로 mtime이것은 우리에게 도움이 되지 않습니다.

를 사용하려면 전체 시스템에 대한 성능 영향이 너무 크지 않도록 별도의 파티션(이상적으로는 램디스크)을 atime사용하는 것이 좋습니다 ./tmp

가 활성화되면 위 명령줄의 매개 atime변수를 . 을(를) 제거할 수도 있지만 확실하게 하기 위해(응용 프로그램이 오랫동안 파일을 열어두는 경우를 대비해) 그대로 두겠습니다.-mtime-atime
-not -exec fuser -s {} ';'

echo그러나 시스템에 여전히 필요한 항목을 제거하기 전에 사용하여 명령을 테스트하는 것을 명심하십시오 !

답변2

스스로 굴리지 마십시오.

데비안/우분투에는 tmpreaper가 있으며 아마도 다른 배포판에서도 사용할 수 있을 것입니다.

# tmpreaper - cleans up files in directories based on their age

sudo apt-get install tmpreaper

cat /etc/tmpreaper.conf 

답변3

질문의 마지막 부분에 관해서 :

'내가 죽으면 삭제' 열기/생성 모드가 존재한다고 생각하지 않지만 프로세스는 해당 파일에 대한 핸들을 유지하는 한 파일을 만든 후 직접 파일을 안전하게 삭제할 수 있습니다. 그런 다음 커널은 파일을 디스크에 보관하고 파일을 연 마지막 프로세스가 종료되자마자(충돌로 인해든 정상적으로든) 파일이 차지한 공간이 해제됩니다.

일부 프로세스가 때때로 /tmp를 정리하지 않는 문제를 해결하는 일반적인 방법으로 마운트 네임스페이스를 살펴보는 것이 좋습니다. 예를 들면 다음과 같습니다.여기또는여기. 문제의 프로세스가 시스템 데몬인 경우,체계화된개인 /tmp 파일 시스템을 허용하는 기본 기능이 흥미로울 수 있습니다.

답변4

그보다 오래된 파일 목록을 얻으려면 해당 목록에서 열려 있는 파일을 제외하세요.

find /tmp -mtime +7 |\
    egrep -v "`lsof -n +D /tmp | awk 'NR>1 {print $9}'| tr \\n \|`" 

lsof -n +D /tmp: /tmp에서 열려 있는 파일을 찾습니다
awk 'NR>1 {print $9}'. : 헤더를 제외하고 lsof 출력의 9번째 열만 인쇄합니다
tr \\n \|. : 새 줄을 bar로 바꿉니다(또는 egrep의 경우)
egrep -v "foo|moo|bar". : foo, moo 또는 bar를 포함하지 않는 줄을 인쇄합니다.

관련 정보