Boas Práticas de Limpeza do /tmp - tmpfiles.d e systemd-tmpfiles
O Que Você Vai Aprender
- Como
/tmp,/var/tmpe/runsão gerenciados pelo systemd - Como escrever regras
tmpfiles.dpara limpeza personalizada - Como executar
systemd-tmpfilesmanualmente e de forma agendada
Resumo Rápido
- A limpeza automática do
/tmpe feita pelosystemd-tmpfiles-clean.timer - Regras personalizadas vão em
/etc/tmpfiles.d/*.conf - Formato da regra:
tipo caminho modo uid gid idade argumento
Pré-requisitos
- SO: Ubuntu ou qualquer Linux baseado em systemd
- Acesso root ou sudo necessário
Por Que o /tmp Precisa de Limpeza?
/tmp é onde as aplicações gravam arquivos temporários. Na maioria dos sistemas Ubuntu, ele é um tmpfs em RAM - limpo na reinicialização. Servidores de longa duração, porém, acumulam arquivos temporários entre reinicializações, o que pode esgotar o espaço em disco e causar referências obsoletas de arquivos PID ou socket.
- Usos típicos: arquivos intermediários de compressão, dados de sessão, arquivos socket
- Padrão Ubuntu:
/tmpé montado comotmpfs, então é limpo na reinicialização /var/tmp: persiste entre reinicializações por design - requer gerenciamento explícito
$ mount | grep /tmp tmpfs on /tmp type tmpfs (rw,nosuid,nodev)
Se /tmp é tmpfs, os arquivos desaparecem na reinicialização. Se é baseado em disco, a limpeza é ainda mais crítica. Verifique o uso com df -h /tmp.
O Que É o systemd-tmpfiles?
systemd-tmpfiles é a ferramenta declarativa para gerenciar diretórios temporários - criando-os no boot, definindo permissões e excluindo arquivos obsoletos de forma agendada.
Três modos de operação:
| Modo | Flag | Ação |
|---|---|---|
| Create | --create |
Criar arquivos/dirs conforme regras |
| Clean | --clean |
Excluir entradas mais antigas que o limite de idade |
| Remove | --remove |
Excluir tudo que corresponde as regras |
$ sudo systemd-tmpfiles --create $ sudo systemd-tmpfiles --clean $ sudo systemd-tmpfiles --remove
Duas unidades systemd executam isso automaticamente:
systemd-tmpfiles-setup.service- executa--createno bootsystemd-tmpfiles-clean.timer- executa--cleanperiodicamente (padrão: 15 min após o boot, depois diariamente)
Como Escrever Regras tmpfiles.d
Coloque arquivos de configuração em /etc/tmpfiles.d/. Os padrões do sistema ficam em /usr/lib/tmpfiles.d/ - nunca edite esses diretamente, pois atualizações de pacotes os sobrescrevem.
Formato
tipo caminho modo uid gid idade argumento
| Campo | Descrição | Exemplo |
|---|---|---|
| tipo | Tipo de operação | d, f, x, e |
| caminho | Caminho alvo | /tmp/myapp |
| modo | Permissões (octal) | 0755 |
| uid/gid | Proprietário (- = manter atual) |
root / - |
| idade | Limite de exclusão para --clean |
7d, 1h, - (nunca) |
| argumento | Conteúdo inicial para arquivos | - |
Tipos Comuns
| Tipo | Significado |
|---|---|
d |
Criar diretório se ausente; --clean remove arquivos antigos dentro |
D |
Como d, mas --remove também exclui o conteúdo do diretório |
f |
Criar arquivo se ausente |
f+ |
Criar ou truncar arquivo |
x |
Excluir de --clean e --remove |
e |
Definir permissões em uma entrada existente |
z |
Definir permissões e rótulos SELinux |
Como Executar a Limpeza Periódica
Verifique o timer de limpeza:
$ systemctl status systemd-tmpfiles-clean.timer
● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
Loaded: loaded (/lib/systemd/system/systemd-tmpfiles-clean.timer; static)
Active: active (waiting) since Mon 2024-01-01 00:00:00 UTC; 3h ago
Trigger: Tue 2024-01-02 00:15:30 UTC; 20h left
Acionar uma limpeza imediata:
$ sudo systemctl start systemd-tmpfiles-clean
--clean só age em entradas onde o campo de idade está definido. Uma entrada com idade - nunca é excluída automaticamente.
Exemplos Práticos
Exemplo 1: Diretório temporário por aplicação com limpeza automática
# /etc/tmpfiles.d/myapp.conf d /tmp/myapp 0750 myapp myapp 1d
Cria /tmp/myapp de propriedade de myapp:myapp com modo 0750, e exclui arquivos internos mais antigos que 1 dia.
Exemplo 2: Limpar logs da aplicação em /var/tmp após 7 dias
# /etc/tmpfiles.d/clean-var-tmp.conf d /var/tmp/app-logs 0755 root root 7d
Exemplo 3: Criar diretório /run no boot sem exclusão automática
# /etc/tmpfiles.d/myapp-run.conf d /run/myapp 0755 myapp myapp -
Idade - significa: criar no boot, nunca excluir automaticamente.
Exemplo 4: Excluir um caminho da limpeza
# /etc/tmpfiles.d/exclude.conf x /tmp/persistent-cache
--clean ignora /tmp/persistent-cache independentemente da idade.
Aplicar e verificar regras imediatamente
# Aplicar regras de criacao agora $ sudo systemd-tmpfiles --create /etc/tmpfiles.d/myapp.conf # Dry run: visualizar o que --clean excluiria $ sudo systemd-tmpfiles --clean --dry-run /etc/tmpfiles.d/myapp.conf
Sempre use --dry-run antes de executar --clean em uma nova regra. Ele mostra o que seria excluído sem fazer nenhuma alteração.
Problemas Comuns
Arquivos não estão sendo excluídos
Verifique se o campo de idade não é -. Note também que --clean usa o atime (último tempo de acesso) como limite, não o mtime.
$ stat /tmp/myfile | grep Access
Se o sistema de arquivos é montado com noatime, o atime nunca é atualizado, então os arquivos podem parecer mais antigos do que são. Use touch -a /tmp/myfile para atualizar o atime manualmente ao testar.
Regras não estão tendo efeito
Valide a configuração diretamente:
$ sudo systemd-tmpfiles --create /etc/tmpfiles.d/myapp.conf
Verifique o journal em busca de erros:
$ journalctl -u systemd-tmpfiles-setup
Sobrescrever uma regra do sistema em /usr/lib/tmpfiles.d/
Coloque um arquivo com o mesmo nome em /etc/tmpfiles.d/ - ele tem prioridade. Ordem de carregamento: /etc > /run > /usr/lib.
# Visualizar a regra do sistema $ cat /usr/lib/tmpfiles.d/tmp.conf # Criar sua sobreposicao e edita-la $ sudo cp /usr/lib/tmpfiles.d/tmp.conf /etc/tmpfiles.d/tmp.conf
O que não fazer
- Editar arquivos em
/usr/lib/tmpfiles.d/diretamente - atualizações de pacotes os sobrescrevem - Usar tipo
Dem um diretório crítico sem limite de idade ---removeexcluirá todo o conteúdo