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


14

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

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

덧붙여서, Linux / Unix는 생성 과정에서 파일을 열 수있는 모드를 허용합니까? 여기서 생성 된 파일은 충돌로 인해 생성 프로세스가 종료 될 때 삭제됩니까?


/ tmp 대신 tmpfs를 사용할 수 있는지 확인하십시오. kernel.org/doc/Documentation/filesystems/tmpfs.txt
ott--

답변:


15

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

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시스템에서 여전히 필요한 것을 제거하기 전에 명령을 사용하여 테스트하십시오 !


좋은. 파일을 업데이트하지 않는 동안 장기 실행 프로세스로 닫은 파일은 어떻습니까? 컨텍스트 파일 인 경우 프로세스 컨텍스트를 느슨하게 할 수 있습니다 (확실히 똑똑한 프로세스는 아니지만 '측면' /tmp/정리 의 예상 부작용을 알아야합니다 ).
nik

이것이 바로이 접근 방식의 문제입니다 (마지막 단락에서 지적했듯이). 여기에 가장 좋은 방법은 uid / gid 또는 파일 패턴 검사를 추가하는 것입니다 (답변을 편집 함)
mreithub

이것을 cron 스크립트에 배치해야합니까?
CMCDragonkai

@CMCDragonkai 물론 이것을 crontab에 넣을 수 있습니다. 그러나 언급했듯이 액세스되었지만 작성되지 않은 파일이있을 수 있으므로이 작은 스크립트로 필터링되지 않을 수 있습니다. 따라서 영향을받는 파일 목록을 먼저 인쇄 한 다음 삭제할지 여부를 결정하는 것이 더 안전한 이유입니다. 귀하 /tmp가 별도의 파티션 (예 : 램 디스크)에있는 atime경우이를 활성화 하고 -atime매개 변수를 사용할 수 있습니다 find.
mreithub

서버에서이 작업을 수행 할 계획입니다. 따라서 항상 tmp의 모든 파일을 계산할 수는 없습니다. 문제가 있습니까? 또한 우리는 relatime을 한 ​​번에 사용해서는 안된다고 생각했습니다.
CMCDragonkai 2016 년

4

스스로 굴리지 마십시오.

데비안 / 우분투에는 tmpreaper가 있으며 다른 곳에서도 사용할 수 있습니다.

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

sudo apt-get install tmpreaper

cat /etc/tmpreaper.conf 

에서 /etc/tmpreaper.conf나는 모두를 설정하면 파일 /tmp/var/tmp정리 디렉토리로, 오랫동안 당신이를 위해 추천 할 수있는 TMPREAPER_TIME매개 변수 또는 TMP 파일의 전 최대 제거 할? /var/tmp파일보다 /tmp파일의 수명을 연장하는 것이 더 좋다고 들었습니다 . 그러나 동일한 최대 연령으로 만 설정할 수 있다면 단서가 없습니다.
Xiaodong Qi

2

질문의 마지막 부분과 관련하여 :

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

일부 프로세스가 때때로 / tmp를 정리하지 않는 문제를 해결하는 일반적인 방법으로 여기 또는 여기에 설명 된 마운트 네임 스페이스를 살펴 보는 것이 좋습니다 . 해당 프로세스가 시스템 데몬 인 경우, 개인용 / tmp 파일 시스템을 허용하는 systemd 및 기본 기능이 유용 할 수 있습니다.



0

이전보다 오래된 파일 목록을 얻으려면 해당 목록에서 열려있는 파일을 제외하십시오.

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 \|: 줄 바꿈으로 새 줄 바꾸기 (egrep에서 OR)
egrep -v "foo|moo|bar": foo 또는 moo 또는 bar를 포함하지 않는 줄 인쇄


0

위의 내용에 동의하지만 여기에 추가 lsof +L1 | grep tmp하려면 "삭제 된"tmp 파일을 유지하는 프로세스를 항상 실행 하고 종료하거나 다시 시작하십시오. EXAMPLE-

# lsof +L1 | grep tmp
xfce4-ter  1699  user   32u   REG    8,6      192     0 818552 /tmp/vte966VLX (deleted)
chrome     3301  user  138u   REG    8,6    16400     0 818547 /tmp/etilqs_Z0guKD7p6ork9iG (deleted)

2
SU는 무작위로 게시물을 정렬하므로 위 또는 아래가 없습니다. 어떤 게시물을 언급하고 있습니까?
Journeyman Geek

0

당신은 할 수 있고 rm -rf /tmp/*아무것도 깨지기를 바랄 수 있습니다 ...


1
무언가를하고 "아무것도 깨지 않기를 바란다"고 제안하는 것이 실제로 OP의 대답에는 해당되지 않습니다. " 안전한 방법 이 있습니다. 아마도 당신의 제안이 안전한 이유에 대해 자세히 설명해 주시겠습니까?
bertieb

@bertieb 좋은 지적입니다. 루트로 실행되지 않으면 아마 안전 할 것 같지만 ...
Solomon Ucko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.