/ tmp의 내용을 수동으로 삭제해야합니까?


26

“오래된”파일 /tmp이 정기적으로 삭제 될 것이라는 인상을 받았습니다 . 그러나 /tmp원하는만큼 오래 성장하고 아무것도 삭제되지 않는 것으로 보입니다 . 어떤 사람들 /tmp은 디스크를 가득 채우는 경우에만 내버려두고 내용을 삭제하는 것이 좋습니다 .

내 질문은, /tmp실제로 스스로를 돌보지 않도록 설계 되었습니까? 모범 사례는 무엇입니까?


1
일반적으로 /tmp재부팅 후 정리되지만, 마운트 된 파일 시스템에 따라 다릅니다. 무엇합니까 df -h말은?
etagenklo

답변:


27

질문에 대답하려면 :

  • 되어 /tmp자동으로 비워 질 예정 :
  • /tmp정기적으로 수동으로 파일을 삭제해야합니까? 아니오 , 시스템에서 처리합니다.

스스로에게 물어볼 수있는 경우 :

  • 나는 파일을 삭제할 수 있습니다 /tmp(등 흔적을 제거 할 필요 공간) 어떤 이유 : 그것은 의존 , 읽어 .

파일 시스템 계층 표준 (FHS) 상태 :

/ tmp 디렉토리는 임시 파일이 필요한 프로그램에 사용 가능해야합니다.

프로그램은 / tmp의 파일 또는 디렉토리가 프로그램 호출간에 유지된다고 가정해서는 안됩니다.

/var/tmp/유사한 목적을 하지만, 재부팅시 삭제.

그것은됩니다 보장되지 것을 /tmp/또는 /var/tmp/정기적으로 정리됩니다. 대부분의 시스템은 때때로 일부 정리를 수행하지만 배포 및 설정에 따라 달라질 수 있습니다. 의 코멘트 를 참조하십시오 mike.

/ tmp 에서 파일을 삭제해야하는 경우 먼저 파일이 사용 중인지 확인하십시오. 당신은 이것을 쉽게 할 수 있습니다 :

lsof /tmp/file_to_delete

권한이있는 경우 프로세스 이름, PID 및 파일 유형과 같이 해당 파일에 대한 핸들을 보유하고있는 프로세스가 표시됩니다. 실제로 모든 프로세스를 표시하려면 sudo사용자 root 앞에 추가 하거나 실행하십시오 .

lsof +D /tmp

/tmp( +D) 아래 에 현재 열려 있는 모든 파일 과 디렉토리 가 표시됩니다 . 물론 이러한 파일을 삭제해서는 안됩니다.

실제로 열려있는 파일을 삭제할 때 (권한이있는 경우) 파일 시스템 네임 스페이스에서 액세스 할 수 없지만 파일 핸들이 열려있는 프로세스에는 여전히 존재합니다. 해당 핸들을 닫은 후에는 해당 프로세스에 대해 더 이상 파일에 액세스 할 수 없으며, 프로세스가 파일을 더 이상 열지 않으면 결국 삭제됩니다. 프로세스는 파일이 후속 open호출 간에도 존속한다고 가정해서는 안되지만 프로그래머는 느슨하며 알 수 없습니다. 따라서 일부 프로그램에서 여전히 사용중인 파일을 삭제 하는 것이 영리 하지 않습니다 .


일반적으로 이것은 모든 훌륭한 조언입니다. 특히 마지막 단락입니다. 그러나 시스템이 실제로 / tmp를 정리하는지 여부는 해당 시스템에 따라 다릅니다. 예를 들어, openSUSE에서는 (/ etc / sysconfig 또는 YaST를 통해) 구성하지 않는 한 그렇지 않습니다 . 또한 사용자의 개인 ~ / tmp (있는 경우)는 자동으로 지워지지 않습니다.
mike

프로세스가 열린 파일을 여전히 삭제할 수 있습니까? 그리고 이것은 프로그램을 중단시키지 않습니까? 그러면 파일은 어디에 존재합니까? 프로그램이 여전히이 "열렸지만 동시에 삭제 된"파일과 상호 작용할 수 있습니까? rm이 파일을 제거하기 어렵거나 불가능하게 만드는 방법이 있습니까? 파일 잠금과 같은 것이 있습니까?
CMCDragonkai

파일은 파일 시스템에서 데이터 세트이며 경로 및 파일 이름을 통해 계층 적 네임 스페이스에서 액세스 할 수 있습니다. 파일은 여러 이름 (하드 링크)을 가질 수 있으며 프로세스는 파일에 대한 열린 핸들을 가질 수 있습니다. 파일에 액세스 할 수없는 경우, 즉 이름이없고 열린 핸들이없는 경우 파일이 삭제됩니다. 삭제를 방지하는 것은 내 전문 지식과 IMO가이 질문의 범위를 벗어납니다. "mandatary locking"을 찾으십시오.
trapicki

[중복 답변이되었습니다]
trapicki

4

나는 이것이 운영 체제에 달려 있다고 생각합니다. 재부팅시 / tmp가 일반적으로 지워지고 실제로 어떤 파일이 활성화되어 있는지 알지 못하기 때문에 세션 중반에 시스템을 정리하는 것이 안전하지 않을 것이라고 생각합니다.

용감한 경우 특정 연령보다 오래된 파일을 삭제하는 명령을 crontab에 던지려고 할 수 있지만 여전히 사용중인 파일을 삭제하면 문제가 발생할 수 있습니다. 당신은 같은 명령을 시도 할 수 있습니다 (나는 그것을 시도하지 않았습니다)

/ tmp -type f -ctime +10 -exec rm {} + 찾기

이론적으로 10 일보다 오래된 / tmp 아래의 모든 파일을 제거합니다.


아마 추가해야 -r그에게
스티븐 페니

1
절대로 -r을 추가하지 마십시오. 그러면 10 일 전에 작성된 디렉토리에있는 파일이 10 일 미만인 파일을 제거하거나 제거 할 수 있습니다. 실제로, 명령은 / tmp -type f -ctime +10 -exec rm {} +를 찾아서 검색을 파일로 제한해야합니다. (find 명령을 사용하면 하위 디렉토리가 재귀됩니다)
davidgo

1

/ tmp 및 / var / tmp 디렉토리는 정상적인 스케줄에 따라 정리됩니다. 배포판에 따라 다를 수 있습니다. CentOS 시스템 (RedHat 복제본)에는 매일 스케줄 에 따라 tmp 디렉토리 클리너 인 tmpwatch 를 실행하도록 예약 된 cron 작업이 있습니다 . / var / tmp의 파일은 / tmp /의 파일보다 조금 더 오래 사용할 수 있습니다. 또한 모든 프로세스가 새로운 프로세스이기 때문에 파일을 열어 두는 것이 아무것도 없다는 것을 알고 재부팅 할 때 / tmp를 제거하는 스크립트를 보았습니다 (그러나 명시 적으로 / var / tmp는 아닙니다).

예, / tmp는 기본 스크립트를 유지 관리합니다. 이 유지 보수 시간이 지나면 여전히 채워질 수 있습니다. 수동으로 정리하도록 선택한 경우 최상의 sysadmin 관행이주의해야합니다. Sysadmin lore는 n00b sysadmins가 간단한 find스크립트를 실행할 때 삭제 된 필요한 시스템 파일을 가리키는 / tmp의 심볼릭 링크에 대해 설명합니다 .


2
Centos 7 및 systemd가있는 다른 RedHat 유사 버전 7+ 시스템에서 정리는 /usr/lib/tmpfiles.d/tmp.conf에 구성됩니다. 이것은 systemd의 대상 systemd-tmpfiles-clean.service에 의해 호출됩니다.
shonky Linux 사용자

1

CentOS에는 주어진 시간 동안 액세스되지 않은 파일을 재귀 적으로 제거 하는 작업이 /etc/cron.daily호출 tmpwatch됩니다. 일반적으로 / tmp와 같은 임시 보유 공간에 사용되는 디렉토리를 정리하는 데 사용됩니다.

이것은 /etc/cron.daily/tmpwatch스크립트입니다

#! / bin / sh
flags = -umc
/ usr / sbin / tmpwatch "$ flags"-x /tmp/.X11-unix -x /tmp/.XIM-unix \
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
        -X '/ tmp / hsperfdata_ *'10d / tmp
/ usr / sbin / tmpwatch "$ flags"30 일 / var / tmp
/ var / {cache / man, catman} / {cat?, X11R6 / cat?, local / cat?}에서 d의 경우; 해야 할 것
    [-d "$ d"] 인 경우; 그때
        / usr / sbin / tmpwatch "$ flags"-f 30d "$ d"
    fi
끝난

/tmp 실행중인 프로세스가 해당 디렉토리에서 파일에 액세스 할 수 있으므로 시스템을 재부팅 할 때만 디렉토리 내용이 삭제됩니다.


0

에서 컨텐츠를 제거 할 수 있습니다 /tmp/. 그러나 그렇게하는 문제는 정기적으로 쓰는 서비스가 /tmp/있고 파일을 삭제하면 다시 시작될 때까지 서비스가 중단되거나 중단 될 수 있다는 것입니다.


0

FHS는 정의 /tmp하고, "종종 시스템 재부팅 사이에 유지되지, (또한은 / var / tmp를 참조) 임시 파일"등의 디렉토리를 /var/tmp"임시 파일이 재부팅 사이에 보존 할"로.

오늘날 /tmp많은 GNU / Linux 배포판에서 기본적으로 RAM 파일 시스템 (tmpfs)으로되어 있지만 (선택적임) /tmp사실상 비 영구적입니다.

(Arguibly) 응용 프로그램은 임시 파일을 적절하게 관리해야하며, 여기에는 사용이 끝나면 삭제하는 것이 포함되며 관리자가 파괴적인 삭제를 예약하지 않아도됩니다.


많은 프로그램이 파일을 /tmp처리하거나 종료 할 때 파일 정리 작업을 훨씬 더 잘 수행 할 수 있지만 /tmp프로그램의 비정상 종료 (충돌) 후에 파일이 남아있는 문제가 여전히 있습니다 .
Kevin Fegan

0

데비안 (또는 우분투와 같은 파생어)을 실행하고 있다면 / etc / default / rcS 파일을보고 TMPTIME환경 변수를 조정해야 합니다. 정의에 따르면 / tmp에있는 내용은 다음에 다시 부팅 할 때 여기서 수행 할 작업이 없습니다.

나는 추천한다

  • TMPTIME서버 에서 변수 사용
  • 데스크탑에서 / tmp를 tmpfs (ram로)로 마운트하십시오 (더 빠른 속도를 위해).

0

배포판은 물론 다르지만 임시 파일은 시스템에서 기본적으로 자동 관리 될 것으로 기대합니다. 크론 작업이나 systemd-tmpfiles-clean 서비스를 사용했을 것입니다. 디스크 공간이 걱정된다면 각 루트 폴더가 차지하는 공간을 살펴 보는 유용한 명령입니다.

du -hs /* | sort -h

시스템이 임시 파일을 관리하기 위해 systemd 서비스를 사용하고 있는지 확인하려면 다음을 시도하십시오.

systemctl status systemd-tmpfiles-clean

맨 아래에는 서비스가 마지막으로 실행 된 시간을 알려주는 다음과 같은 내용이 표시됩니다.

systemd-tmpfiles-clean.service - Cleanup of Temporary Directories
   Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.service; static; vendor preset: disabled)
   Active: inactive (dead) since Wed 2018-07-18 15:43:36 IST; 18h ago
     Docs: man:tmpfiles.d(5)
           man:systemd-tmpfiles(8)
  Process: 30495 ExecStart=/usr/bin/systemd-tmpfiles --clean (code=exited, status=0/SUCCESS)
 Main PID: 30495 (code=exited, status=0/SUCCESS)

Jul 18 15:43:36 host-name systemd[1]: Starting Cleanup of Temporary Directories...
Jul 18 15:43:36 host-name systemd[1]: Started Cleanup of Temporary Directories.

이 서비스는 정리가 완료되는 즉시 종료됩니다. 타이머 서비스는 정기적으로 트리거해야합니다. 당신은 그것을 확인할 수 있습니다 :

systemctl status systemd-tmpfiles-clean.timer

그리고 다음과 같은 것을 기대해야합니다.

systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
   Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled)
   Active: active (waiting) since Tue 2018-07-03 10:56:59 IST; 2 weeks 1 days ago
     Docs: man:tmpfiles.d(5)
           man:systemd-tmpfiles(8)

Jul 03 10:56:59 host-name systemd[1]: Started Daily Cleanup of Temporary Directories.
Jul 03 10:56:59 host-name systemd[1]: Starting Daily Cleanup of Temporary Directories.

파일 정리를 담당하는 실제 서비스를 다시 살펴보면 모든 파일이 실행되고 있음을 알 수 있습니다.

/usr/bin/systemd-tmpfiles --clean

따라서 해당 명령을 직접 실행하거나 올바르게 수행하려면 다음을 수행하십시오.

systemctl start systemd-tmpfiles-clean

시스템에 적절한 명령을 실행합니다. 그러나이 명령은 "지금 모든 임시 파일 삭제"명령이 아닙니다. 실제로 삭제되는 항목과시기를 제어하여 응용 프로그램이 임시 파일을 개별적으로 구성 할 수 있도록하는 여러 구성 파일이 있습니다.

임시 파일의 일반적인 처리 방법을 찾아 볼 /usr/lib/tmpfiles.d/tmp.conf수있는 곳은 다음과 같습니다.

# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d

시스템 공간이 계속 부족한 경우 다음과 같이 짧은 시간으로 변경할 수 있습니다.

v /tmp 1777 root root 12h
v /var/tmp 1777 root root 1d

무엇을하고 있는지 확인하려면 man tmpfiles.d설명서를 읽으십시오. 다시, 여기에 제시된 접근 방식이 CentOS (RedHat 기반) 및 Ubuntu 시스템과 관련이 있다는 것을 알았지 만 다른 배포판에 대해서는 많이 알지 못합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.