Como o diretório / tmp é limpo?

301

Como o /tmpdiretório é limpo? É automático? Em caso afirmativo, com que frequência é limpo?

Olivier Lalonde
fonte
15
Meus arquivos temporários nunca são gravados no disco. Eles são gravados em um disco RAM. Eu coloquei tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0no / etc / fstab.
Anônimo

Respostas:

192

Nota! Esta resposta está desatualizada desde pelo menos o ubuntu 14.04. Veja outras respostas para a situação atual e, se elas se mostrarem corretas, faça um voto positivo. Também postar comentário para que eu possa colocar o link aqui para a resposta correta atual.

Para 14.04, consulte https://askubuntu.com/a/759048/1366

Para 16.10, consulte https://askubuntu.com/a/857154/453746


Antiga resposta de 2011:

A limpeza /tmpé feita pelo script inicial /etc/init/mounted-tmp.conf. O script é executado pelo iniciante toda vez que /tmpé montado. Praticamente isso significa em cada inicialização.

O script faz aproximadamente o seguinte: se um arquivo /tmptiver mais de um $TMPTIMEdia, ele será excluído.

O valor padrão $TMPTIMEé 0, o que significa que todos os arquivos e diretórios /tmpsão excluídos. $TMPTIMEé uma variável de ambiente definida em /etc/default/rcS.

lesmana
fonte
Isso não é mais verdade para 14.04 (o script não existe mais).
Martin Schröder
@ Martin Schröder - o script existe no meu sistema e é uma instalação limpa do 14.04 e o tmpreaper não existe!
Lance Holland
Estou usando o arch linux agora, portanto não posso verificar. Desculpa. Por favor, alguém verifique isso e comente ou edite minha resposta.
Lesmana
4
no Ubuntu 16.04 tmpreaper é abandonado como un-secure consulte: fossies.org/linux/tmpreaper/debian/README.security
tamerlaha
1
Não. No Ubuntu 16.04, ele é simplesmente substituído por um mecanismo systemd. Leia esse documento e o que você realmente encontrará é uma explicação de por que a análise de segurança alegando insegurança é falha.
JdeBP # 16/18
141

O diretório é limpo por padrão a cada inicialização, porque TMPTIMEé 0 por padrão.

Aqui você pode alterar a hora no seguinte arquivo:

/etc/default/rcS

TMPTIME diz com que frequência o diretório tmp deve ser limpo em dias

Max Ruf
fonte
9
A limpeza a cada inicialização não é ideal para uma máquina que nunca é reinicializada, como um servidor. Eu tenho mais de 500.000 arquivos ocupando espaço de 5 GB no meu / tmp porque meu servidor tem 378 dias de atividade. Estou relutante em reiniciá-lo, simplesmente porque limpar esses arquivos na reinicialização leva horas.
Rjmunro
10
No seu caso, você deve dar tmpreaperuma chance.
QBI
1
Um trabalho CRON poderia resolver isso facilmente.
Ken afiada
Também tmpwatchdeve ser uma ferramenta apropriada.
ArekBulski
1
Parece que o Ubuntu / systemd já fornece uma solução. Eu diria mais, mas ... systemd.
Ken Sharp
65

Embora a /tmppasta não seja um local para armazenar arquivos a longo prazo, ocasionalmente você deseja manter as coisas um pouco mais do que na próxima vez que reiniciar , o que é o padrão nos sistemas Ubuntu. Sei uma ou duas vezes que baixei algo /tmpdurante o teste, reiniciei depois de fazer alterações e perdi os dados originais novamente. Isso pode ser alterado se você quiser manter seus /tmparquivos um pouco mais.

Alterando a /tmpfrequência de limpeza

A configuração padrão que informa ao sistema para limpar /tmpna reinicialização é mantida no /etc/default/rcSarquivo. O valor que veremos é TMPTIME.

O valor atual de TMPTIME=0diz excluir arquivos na reinicialização, apesar da idade do arquivo. Alterar esse valor para um número diferente (positivo) mudará o número de dias em que um arquivo pode sobreviver /tmp.

TMPTIME=7

Essa configuração permite que os arquivos permaneçam /tmpaté uma semana de idade e os exclua na próxima reinicialização. Um número negativo ( TMPTIME=-1) indica ao sistema para nunca excluir nada /tmp. Provavelmente, isso não é algo que você deseja, mas está disponível.

hhlp
fonte
1
boa explicação. Mas em qual script é o comando de limpeza? Eu já vi /etc/init/mounted-temp.conf, mas tem a linha start on mounted MOUNTPOINT=/tmpque me faz pensar que não é aplicável.
enzotib
7
Se você não deseja que um arquivo seja removido automaticamente, insira-o em /var/tmpvez de /tmp.
Gilles
1
Também é útil manter os arquivos que você não deseja perder (quadros de vídeo renderizados) quando a máquina falha, possivelmente devido ao OOM. Uma solução melhor seria resolver o problema, é claro. :-)
Ken Sharp
Isso pode ser feito dentro do Cygwin?
CMCDragonkai
46

Estou verificando isso no Ubuntu 16.10. Posso certificar que a edição de / etc / default / rcS não tem mais efeito algum e os arquivos em tmp são eliminados pela reinicialização, independentemente do que você colocar nesse arquivo. Como outros mencionam, o tmpreaper não é mais usado.

Eu acho que a resposta certa é que o Ubuntu 16.10 tem uma nova configuração. Há uma pasta /etc/tmpfiles.d, documentada na página de manual "tmpfiles.d". Nessa pasta, deve-se colocar um arquivo de configuração para controlar se o / tmp deve ser apagado. Isto é o que estou fazendo para impedir que as reinicializações apaguem arquivos no / tmp, a menos que tenham 20 dias:

#/etc/tmpfiles.d/tmp.conf

d /tmp 1777 root root 20d

Substitua "20d" por "-" se você nunca quiser excluir os arquivos. Este é o meu melhor esforço, essa página de manual é quase impenetrável com detalhes.

A vantagem da nova configuração é que um limpador de arquivos ainda pode ser executado, mesmo que o sistema não seja reinicializado (como no caso de um servidor sempre ativo). Essa é uma grande vantagem, eu acho.

pauljohn32
fonte
5
man tmpfiles.d
Martin Schröder
Eu descobri que você pode preservar o original permissões de arquivo e proprietário usando hífens:d /tmp/ - - - 20d
Dave Yarwood
2
Também vale ressaltar: você pode testar sua configuração executando o trabalho de limpeza manualmente:systemctl start systemd-tmpfiles-clean
Dave Yarwood
@ pauljohn32 Isso também é válido para versões após a 16.10?
Kapad #
3
@ kapad: Acabei de verificar que isso também funciona no Ubuntu 18.04.
Gene Vincent
26

No Ubuntu 14.04, isso é feito por tmpreaper, chamado diariamente pelo cron (from /etc/cron.daily). O programa pode ser configurado via /etc/default/rcSe /etc/tmpreaper.conf.

Martin Schröder
fonte
no meu sistema, tmpreaper não estava em /etc/cron.daily - mas eu era capaz de instalá-lo com o apt-get
Joe Germuska
10

Antes de 14.04:

É limpo toda vez que você reinicia.

Utku Demir
fonte
Aparece com 14.04+ ele só usa tmpreaper, não o "per boot" roteiro FWIW
rogerdpack
Todos os meus sistemas 14.04 são limpos na reinicialização. Nunca ouvi falar tmpreaper.
Ken Sharp
e se você nunca reiniciar o sistema?
Phuclv
8

Em um systemdUbuntu (15.10 e mais recente), isso é feito pelo systemd, usando o systemd-tmpfiles-cleanserviço e o timer:

$ systemctl cat systemd-tmpfiles-clean.service 
# /lib/systemd/system/systemd-tmpfiles-clean.service
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=local-fs.target time-sync.target
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/bin/systemd-tmpfiles --clean
IOSchedulingClass=idle

E

$ systemctl cat systemd-tmpfiles-clean.timer  
# /lib/systemd/system/systemd-tmpfiles-clean.timer
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

Então, systemd-tmpfiles-cleané executado no desligamento, e uma vez por dia, caso contrário. Os arquivos que ele limpa podem ser estendidos usando os /etc/tmpfiles.dmencionados em outra resposta .

Você pode alterar o comportamento do timer usando systemctl edit systemd-tmpfiles-clean.timere usando várias Timeropções de configuração do systemd (consulte man 5 systemd.timer).

muru
fonte
Alterei o timer para 20min e vejo que o comando status mostra que ele está realmente usando a configuração 20min. mas o meu problema é que /tmpainda não está limpo. e eu preciso que seja limpo. até o início manual sudo systemctl start systemd-tmpfiles-cleannão funciona. Alguma idéia do porquê?
user2932688 27/06
4

Em um de nossos servidores executando o Ubuntu, temos um script para remover arquivos em / tmp e ele é executado todas as noites.

O script é:

#!/bin/sh
# Clean file and dirs more than 3 days old in /tmp nightly

/usr/bin/find /tmp -type f -atime +2 -mtime +2  |xargs  /bin/rm -f &&

/usr/bin/find /tmp -type d -mtime +2 -exec /bin/rm -rf '{}' \; &&

/usr/bin/find /tmp -type l -ctime +2 |xargs /bin/rm -f &&

/usr/bin/find -L /tmp -mtime +2 -print -exec rm -f {} \;

Apenas salve o conteúdo acima em um arquivo chmod 775 e crie uma entrada cron para executá-lo. Como este é um servidor web, não queremos reiniciá-lo por razões óbvias.

Paulo
fonte
6
Você pode estar melhor usando o tmpwatch .
poolie 28/09
9
A última linha é extremamente perigosa. Normalmente, todo mundo é capaz de executar ln -s /usr /tmp/kaboomou mesmo ln -s /* /tmp/...
Daniel Alder