"systemd-tmpfiles --clean"이 작동하지 않는 이유는 무엇입니까?

"systemd-tmpfiles --clean"이 작동하지 않는 이유는 무엇입니까?

임시 파일을 정리하기 위해 다음과 같은 구성을 사용했습니다(CentOS 7의 경우 기본값). 이는 /tmp파일이 10일보다 오래되면 삭제해야 함을 나타냅니다.

[root]# tail -n +10 /usr/lib/tmpfiles.d/tmp.conf | head -n 3
# Clear tmp directories separately, to make them easier to override
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d

그런데 실행하고 나서도 systemd-tmpfiles --clean내용을 보면 /tmp10일이 넘은 파일들이 들어있습니다.

[root]# ls -dl /tmp/backup-inspection
drwxr-xr-x 8 root root 68 Aug 29  2014 /tmp/backup-inspection

이 디렉토리의 내용은 /tmp상당히 큽니다.

[root]# du -h /tmp | tail -n 1
3.5G    /tmp

backup-inspection이 디렉토리가 삭제되지 않는 이유를 설명해 줄 수 있는 사람이 있습니까 ? 벌써 거의 1살이 됐나요?

답변1

최근에 동일한 문제에 직면하여 이 문제를 발견하여 경험을 공유하고 있습니다.

실제로 systemd-tmpfiles예상한 대로 재귀 디렉터리 트리 처리가 완전히 지원됩니다(다른 답변은 소스 코드를 확인할 만큼 혼란스럽습니다). 내 경우에는 atime파일 이 삭제 되지 않는 이유는 .systemd-tmpfilesctimemtimeatime

systemd-tmpfiles실제로 파일 건너뛰기에 대한 내부 규칙이 많기 때문에 다른 이유가 있을 수 있습니다 . 일부 파일이 삭제되지 않은 이유를 확인하려면 systemd-tmpfiles다음 명령을 실행하십시오.

env SYSTEMD_LOG_LEVEL=debug systemd-tmpfiles --clean

콘솔에 많은 출력을 덤프할 수 있습니다. stdout예를 들어 파일로 리디렉션하려고 하면 출력이 사라지고 systemd 로그로 전송됩니다(예를 들어 를 통해 얻을 수 있음 journalctl). 내 경우에는 출력도 중간에 잘려서(또는 사용법을 몰랐기 때문에 journalctl) 터미널 에뮬레이터의 히스토리 버퍼를 일시적으로 늘리는 것이 해결책이었습니다.

답변2

최근에 나는 내 권한에 따라 서버에서 유사한 문제를 해결하기 위해 최선을 다해 노력해 왔습니다.

간단한 대답은 기본적으로 다음과 같습니다.systemd-tmpfiles --clean엉망이야, 대안을 찾아야 해

그다지 간단하지 않은 답변은 약간 깁니다.

systemd-tmpfiles다양한 작업을 수행하지만 기본 작업 --clean은 옵션과 관련이 없습니다. 즉, 재부팅 시 시스템 상태가 적절하게 "재설정"되는지 확인합니다. 즉, 다양한 이유로 존재해야 하는 디렉터리와 파일이 생성되고, 존재해서는 안 되는 디렉터리와 파일이 삭제되도록 보장합니다(파일 시스템 하위 볼륨 및 할당량 생성, 블록 장치 생성과 같은 상대적으로 난해한 항목의 긴 목록과 함께). 등)., 권한 변경, SELinux 속성 등 내용이 궁금하신 분은 맨페이지를 참고해주세요.) 이러한 작업은 systemd-tmpfiles --create(대부분의 경우) 및 systemd-tmpfiles --remove(파일 및 디렉터리 삭제) 에 의해 수행됩니다 . 이 두 하위 명령은 각 구성 줄의 시작 부분을 대략적으로 고려합니다. 첫 번째 필드는 작업 유형, 두 번째 필드는 대상, 세 번째 필드는 모드 등입니다. 일반적으로 이와 같은 작업은 systemd-tmpfiles --create --remove시스템이 부팅된 직후, 수행하는 작업에 따라 달라질 수 있는 작업이 수행되기 전에 실행됩니다. 한 가지 중요한 점은 이러한 작업에서는 다섯 번째 매개 변수인 Age 매개 변수를 확인하지 않는다는 것입니다. 이것이 --clean들어오는 곳입니다.

systemd-tmpfiles --clean기본적으로 추가 필드(Age 필드)를 사용하여 이 인프라에 편승합니다. 그러나 다른 하위 명령인 d, D, v, q, Q, C, xX(정리에서 특정 항목을 제외하기 위해 존재하는) 에 의해 수행되는 일부 특정 유형의 작업만 고려합니다 . 이들 중 일반적인 사용 사례와 관련된 유일한 것은 d각각 D디렉토리의 경우 create-if-doesn't-exist 및 create-if-doesn't-exist-or-emptying-if-it-does입니다. 연령을 표시한 후 systemd-tmpfiles --clean연령이 구성된 것보다 오래되면 나열된 경로가 제거됩니다.

문제는 이것이 실제로 무엇을 의미하는가입니다.나열된 경로만- 연령 태그는 폴더 내용에 반복적으로 적용되지 않습니다. 즉, 귀하의 질문에 있는 구성 줄은 전체 /tmp또는 /var/tmp, 그리고 각각 10일 또는 30일 동안 아무 일도 일어나지 않은 경우에만 삭제된다는 것을 의미합니다. 설상가상으로 x연령에 영향을 미치는 요소 중 와 를 제외하고는 글로벌을 지원하는 요소가 없습니다 X.들어오지 못하게 하다정리 중인 물건들.

맨페이지에는 tmpfiles.d운이 좋다면 적용할 수 있는 흥미로운 내용이 나열되어 있습니다. "age 필드가 물결표 문자 "~"로 시작하는 경우 정리는 지정된 디렉터리 및 디렉터리 내의 한 수준 내 파일에만 적용됩니다. , 그러나 그 안에 있는 파일과 디렉터리는 그렇지 않습니다." - 제 경우에는 다음 두 가지 수준에서 정리를 수행해야 했기 /tmp때문에 좋은 효과를 발휘할 수 없었습니다.

지금처럼 끝까지 묶여 있지 않고 디렉토리 내용을 주요 목적으로 처리 하는 다른 /tmp솔루션을 찾아보십시오 systemd-tmpfiles --clean.

답변3

  • d디렉토리를 생성하는데 사용됨
  • r파일 삭제용

에서 tempfiles.d(5). 다른 것은 필요하지 않습니다. 다음을 시도해 보십시오.

d /tmp      1d

   d
       Create a directory if it does not exist yet.

   D
       Create or empty a directory.
r
       Remove a file or directory if it exists. This may not be used to
       remove non-empty directories, use R for that. Lines of this type
       accept shell-style globs in place of normal path names. Does not
       follow symlinks.

   R
       Recursively remove a path and all its subdirectories (if it is a
       directory). Lines of this type accept shell-style globs in place
       of normal path names. Does not follow symlinks.

답변4

나 역시 이 문제로 오랫동안 고민했다.

내 상황은 7일 동안 사용되지 않은 파일을 제거해야 하는 사용자 지정 tmp 디렉터리(사용자 지정 응용 프로그램에 필요하고 빠른 SSD 디스크에 배치됨)가 있다는 것입니다.

결국 내가 한 일은 /etc/tmpfiles.d"foo.conf"라는 파일 안에 다음 줄이 포함된 파일을 만드는 것이었습니다.

d /foo/tmp - - - 7d

그것이 하는 일은 (나는 희망한다) 다음과 같다:

  1. /foo/tmpatime, mtime, ctime이 7일을 초과하는 파일 및 디렉터리를 삭제합니다.
  2. 재부팅 시 콘텐츠를 삭제하지 마세요.
  3. 디렉터리가 없으면 새로 만듭니다(항상 존재함).
  4. 디렉토리의 소유권과 권한을 변경하지 마십시오(모드, UID 및 GID는 모두 로 설정됨 -).

r나이로 인해 파일을 삭제하는 데 사용되지 않는 것이 매우 혼란스러운 것 같습니다. 매뉴얼 페이지에서:

age 필드는 d, D, e, v, q, Q, C, x 및 X로 시작하는 줄에만 적용됩니다.

관련 정보