Por que o 'systemd-tmpfiles --clean' não está funcionando?

1

Eu tenho a seguinte configuração para limpar arquivos temporários (padrão para o CentOS 7), que diz que os arquivos em /tmp devem ser removidos se tiverem mais de 10 dias.

[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

No entanto, mesmo depois de executar systemd-tmpfiles --clean , quando olho para o conteúdo de /tmp , há arquivos com mais de 10 dias de idade.

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

O conteúdo do diretório /tmp é enorme:

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

Alguém pode me explicar por que o diretório backup-inspection não foi removido? Tem quase 1 ano de idade?

    
por magnus 03.08.2015 / 03:10

3 respostas

5

Eu tenho feito muitos esforços ultimamente para resolver problemas semelhantes em servidores sob minha alçada.

A resposta simples é basicamente apenas: systemd-tmpfiles --clean é uma bagunça quente e você deve procurar alternativas

A resposta menos simples é um pouco longa.

systemd-tmpfiles realiza várias tarefas, mas a principal delas não está relacionada à opção --clean : garantir que o estado de seu sistema seja apropriadamente "redefinido" durante as reinicializações. Isto é, assegura que diretórios e arquivos que precisam existir por várias razões sejam criados, e aqueles que não deveriam existir sejam removidos (junto com uma longa lista de itens relativamente esotéricos como criar subvolumes e quotas do sistema de arquivos, bloquear dispositivos, etc. , alterando permissões, atributos do SELinux, etc. Veja a manpage se você está curioso sobre tudo). Essas tarefas são executadas por systemd-tmpfiles --create (para a maioria das coisas) e systemd-tmpfiles --remove (para remoção de arquivos e diretórios). Esses dois subcomandos consideram, aproximadamente, o início de cada linha de configuração: o primeiro campo é o tipo de ação, o segundo o destino, o terceiro o modo etc. Geralmente, algo como systemd-tmpfiles --create --remove é executado logo após a inicialização do sistema , antes de qualquer coisa que possa depender das ações necessárias. Uma coisa importante a notar é que essas ações nunca olham para o quinto argumento, o parâmetro Age. É aí que entra --clean .

systemd-tmpfiles --clean basicamente pega carona na parte superior dessa infraestrutura por meio de um único campo adicionado: o campo Idade. Ele considera apenas alguns dos tipos específicos de ações que os outros subcomandos executam, porém: d, D, v, q, Q, C e também x e X (que existem apenas para excluir itens específicos de sua limpeza). Os que são relevantes para casos de uso normais são apenas d e D , embora usados para diretórios, criação-se-não-existe e criação-se-não-existir-ou-esvaziar -se-faz, respectivamente. Com as idades marcadas, systemd-tmpfiles --clean removerá o caminho listado quando a idade for mais antiga que a configurada.

Aqui está o problema: significa realmente o caminho listado apenas - a marcação de idade não é aplicada recursivamente ao conteúdo da pasta. Isso significa que as linhas de configuração da sua pergunta sempre removerão a totalidade de /tmp ou /var/tmp e somente se nada acontecer dentro de 10 ou 30 dias, respectivamente. Para piorar as coisas, nenhuma das coisas que afetam a idade suporta globs, exceto x e X , que são para excluir as coisas da limpeza.

A página tmpfiles.d lista uma coisa interessante que pode funcionar para o seu caso, se você tiver sorte: "Se o campo de idade começar com um caractere til" ~ ", a limpeza será aplicada apenas aos arquivos e diretórios um nível dentro do diretório especificado, mas não os arquivos e diretórios imediatamente dentro dele. " - no meu caso, a limpeza precisava acontecer dois níveis abaixo de /tmp , então não havia como usar isso com bons resultados.

Procure outras soluções para limpar o conteúdo do diretório /tmp , que considera seu objetivo principal, em vez de ser colocado no final como systemd-tmpfiles --clean .

    
por 06.01.2016 / 19:01
4

Eu encontrei o mesmo problema recentemente e encontrei essa pergunta, então estou compartilhando minha experiência.

Na verdade, systemd-tmpfiles tem suporte total para o processamento de árvore de diretórios recursivo, como seria de se esperar (a outra resposta me confundiu o suficiente para verificar o código-fonte). O motivo pelo qual os arquivos não foram excluídos (no meu caso) foi atime . systemd-tmpfiles verifica ctime (exceto para diretórios), mtime e atime e todos os três (ou dois) deles devem ter idade suficiente para o arquivo (ou diretório) ser excluído.

Na verdade, pode haver outros motivos, porque systemd-tmpfiles tem muitas regras internas para ignorar arquivos. Para descobrir por que alguns arquivos não são excluídos, execute systemd-tmpfiles da seguinte forma:

env SYSTEMD_LOG_LEVEL=debug systemd-tmpfiles --clean

Ele provavelmente despejará muitos resultados em seu console. Se você tentar redirecionar stdout para, por exemplo, um arquivo, a saída desaparece e é enviado para o diário systemd (para que possa ser obtido por meio de, por exemplo, journalctl ). No meu caso, a saída também foi cortada no meio (ou eu simplesmente não sei como usar journalctl ), então minha solução foi aumentar temporariamente o buffer de histórico no meu emulador de terminal.

    
por 22.02.2016 / 02:06
0
  • d é para criar diretórios
  • r é para remover arquivos

De tempfiles.d(5) . Você não precisa das outras coisas, tente:

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.
    
por 18.10.2015 / 22:58

Tags