Devemos excluir manualmente o conteúdo de / tmp?

26

Fiquei com a impressão de que os arquivos "antigos" /tmpserão excluídos regularmente. No entanto, parece-me que /tmpapenas crescerá enquanto quiser, e nada será excluído. Algumas pessoas dizem que é melhor sair /tmpsozinho e excluir seu conteúdo apenas se o disco estiver ficando cheio.

Minha pergunta é, é /tmprealmente projetado para não cuidar de si mesmo? quais são as melhores práticas?

EU SOU B
fonte
1
normalmente /tmpé limpo após a reinicialização, mas isso depende do sistema de arquivos montado lá. O que df -hdiz?
etagenklo

Respostas:

27

Para responder às perguntas:

  • É /tmpsuposto ser esvaziado automaticamente: Sim
  • Devemos excluir os arquivos /tmpregularmente e manualmente: Não , seu sistema cuidará deles.

Se você se perguntar:

  • Posso excluir arquivos /tmppor qualquer motivo (precisa de espaço, deseja remover vestígios etc.): Depende , continue a ler .

O Padrão de hierarquia de sistemas de arquivos (FHS) declara :

O diretório / tmp deve estar disponível para programas que requerem arquivos temporários.

Os programas não devem assumir que quaisquer arquivos ou diretórios em / tmp sejam preservados entre as invocações do programa.

/var/tmp/tem um objetivo semelhante , mas não deve ser excluído durante a reinicialização.

Não é garantido que /tmp/ou /var/tmp/seja limpo regularmente. Isso pode depender da sua distribuição e configurações, embora a maioria dos sistemas faça alguma limpeza periodicamente. Ver comentário por mike.

Se você precisar excluir um arquivo em / tmp , verifique primeiro se o arquivo está em uso. Você pode fazer isso facilmente com:

lsof /tmp/file_to_delete

Se você tiver direitos para fazê-lo, isso mostrará o processo segurando o identificador desse arquivo, como nome do processo, PID e tipo do arquivo. Para mostrar realmente todos os processos, adicione sudoou execute como root do usuário .

lsof +D /tmp

mostrará todos os arquivos /tmpe diretórios abaixo ( +D) que estão abertos no momento. Claro que você não deve excluir esses arquivos.

De fato, quando você exclui um arquivo que ainda está aberto - se você tiver o direito de fazê-lo - ele fica inacessível no espaço para nome do sistema de arquivos, mas ainda existe para os processos que possuem um arquivo aberto para ele. Depois de fechar esse identificador, o arquivo não está mais acessível para esse processo e, se nenhum processo tiver aberto mais, ele será excluído. Um processo não deve supor que o arquivo sobreviva entre as openchamadas subseqüentes , mas os programadores são desleixados e você nunca sabe. Por esse motivo, não é tão inteligente excluir arquivos que ainda estão em uso por alguns programas.

trapicki
fonte
Em geral, todos esses conselhos são excelentes, especialmente o último parágrafo. Mas se um sistema realmente limpa / tmp depende desse sistema. Por exemplo, no openSUSE, isso não ocorre , a menos que você o configure (a partir de / etc / sysconfig ou via YaST). Além disso, o ~ / tmp pessoal dos usuários (se eles tiverem um) não é limpo automaticamente.
13005 Mike
Portanto, ainda é possível excluir arquivos que os processos foram abertos? E isso não trava o programa? Onde o arquivo existe então? O programa ainda pode interagir com esse arquivo "aberto, mas excluído simultaneamente"? Existe alguma maneira de tornar difícil ou impossível para a rm remover o arquivo? Algo como um bloqueio de arquivo, talvez?
precisa saber é o seguinte
Arquivos são conjuntos de dados no sistema de arquivos que são acessíveis em um espaço para nome hierárquico, por meio de um caminho e um nome de arquivo. Um arquivo pode ter vários nomes (links físicos) e o processo pode ter um identificador aberto para um arquivo. Se o arquivo não estiver acessível, ou seja, quando não tiver nome e identificador aberto, ele será excluído. Impedir uma exclusão está além dos meus conhecimentos e a IMO está além do escopo desta pergunta. Tente procurar por "bloqueio obrigatório".
Trapicki
[foi uma resposta duplicado]
trapicki
4

Eu acho que isso depende do sistema operacional. Eu imagino que / tmp é normalmente limpo na reinicialização e, de fato, não seria seguro para o sistema se limpar no meio da sessão, pois não saberá quais arquivos estão ativos.

Se você for corajoso, convém lançar um comando no crontab que exclui arquivos mais antigos que uma certa idade, mas isso pode causar alguns problemas se excluir os arquivos ainda usados. Você pode tentar um comando (eu não tentei) como

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

Que teoricamente removerá todos os arquivos em / tmp com mais de 10 dias.

davidgo
fonte
provavelmente deve adicionar -ra isso
Steven Penny
1
Absolutamente NÃO adicione -r a isso - isso terá o efeito ou remover arquivos com menos de 10 dias de idade, onde eles existem em diretórios criados mais de 10 dias atrás. De fato, o comando provavelmente deve encontrar / tmp -type f -ctime +10 -exec rm {} + para limitar a pesquisa aos arquivos. (Usando o comando find irá recorrer subdiretórios)
davidgo
1

Os diretórios / tmp e / var / tmp são limpos em uma programação normal. Isso pode depender da sua distribuição. No meu sistema CentOS (um clone do RedHat), há um trabalho cron agendado para executar tmpwatch , um limpador de diretório tmp, em uma programação diária . Os arquivos em / var / tmp podem ficar um pouco mais longos que os arquivos em / tmp /. Também vi scripts que podam / tmp (mas explicitamente não / var / tmp) em uma reinicialização, sabendo que não pode haver nada mantendo esse arquivo aberto, pois todos os processos são novos.

Então, sim, / tmp possui manutenção a partir de scripts básicos. Ele ainda pode ser preenchido fora desses tempos de manutenção. Se você optar por limpar as coisas manualmente, a melhor prática do sysadmin é ter cuidado. O conhecimento do Sysadmin fala sobre links simbólicos em / tmp apontando para os arquivos de sistema necessários que foram excluídos quando o n00b sysadmins executou um findscript simples .

Rich Homolka
fonte
2
No Centos 7 e em outros sistemas RedHat versão 7+ com systemd, a limpeza é configurada em /usr/lib/tmpfiles.d/tmp.conf. Isso é invocado pelo destino systemd-tmpfiles-clean.service do systemd.
22415 shonky linux user
1

No CentOS, existe um trabalho /etc/cron.dailychamado tmpwatchque remove recursivamente os arquivos que não foram acessados ​​por um determinado período. Normalmente, é usado para limpar diretórios que são usados ​​para espaço de espera temporário, como / tmp.

Este é o /etc/cron.daily/tmpwatchscript

#! / 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" 30d / var / tmp
para d em / var / {cache / man, catman} / {cat?, X11R6 / cat?, local / cat?}; Faz
    se [-d "$ d"]; então
        / usr / sbin / tmpwatch "$ flags" -f 30d "$ d"
    fi
feito

/tmp o conteúdo do diretório é excluído apenas quando o sistema é reiniciado, porque o processo em execução pode ter acesso a arquivos desse diretório.

max
fonte
0

Você pode remover o conteúdo de /tmp/; mas o problema é que, se você tiver um serviço que grava regularmente /tmp/e exclui os arquivos, pode causar uma falha ou interrupção no serviço até que seja reiniciado.


fonte
0

O FHS define o /tmpdiretório como "arquivos temporários (consulte também / var / tmp), geralmente não preservados entre as reinicializações do sistema" e /var/tmp"arquivos temporários a serem preservados entre as reinicializações".

Atualmente, por /tmpser um sistema de arquivos RAM (tmpfs) por padrão (embora opcional) em muitas distribuições GNU / Linux, /tmpé efetivamente não persistente.

(Indiscutivelmente) os aplicativos devem gerenciar seus arquivos temporários de acordo, o que, na minha opinião, inclui excluí-los quando seu uso terminar e não exigir que os administradores planejem possíveis exclusões destrutivas.

dawud
fonte
Muitos programas podem fazer um trabalho muito melhor de limpeza de arquivos /tmpquando terminam com eles ou quando saem, mas ainda existe um problema de arquivos deixados /tmpapós uma interrupção anormal (falha) de um programa.
Kevin Fegan
0

Se você estiver executando o Debian (ou um derivado como o Ubuntu), verifique seu arquivo / etc / default / rcS e ajuste a TMPTIMEvariável de ambiente. Por definição, o que reside em / tmp não tem nada a ver aqui na próxima reinicialização.

Eu recomendo

  • usando a TMPTIMEvariável em um servidor
  • mount / tmp como tmpfs (em ram) em uma área de trabalho (para obter mais velocidade)
maxxvw
fonte
0

As distribuições são diferentes, é claro, mas eu esperaria que os arquivos temporários fossem gerenciados automaticamente pelo sistema imediatamente. Eles provavelmente usariam tarefas cron ou o serviço systemd-tmpfiles-clean. Se você estiver preocupado com espaço em disco, este é um comando útil para verificar quanto espaço cada pasta raiz está ocupando:

du -hs /* | sort -h

Para ver se seu sistema está usando o serviço systemd para gerenciar arquivos temporários, você pode apenas tentar:

systemctl status systemd-tmpfiles-clean

Na parte inferior, você verá algo como o seguinte, que informa quando o serviço foi executado pela última vez:

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.

Observe que este serviço será encerrado assim que for feito com a limpeza. Um serviço de timer é responsável por ativá-lo regularmente. Você pode verificá-lo com:

systemctl status systemd-tmpfiles-clean.timer

E você deve esperar algo como o seguinte:

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.

Se você olhar novamente para o serviço real responsável pela limpeza dos arquivos, verá que tudo o que faz é executado:

/usr/bin/systemd-tmpfiles --clean

Portanto, você pode executar esse comando diretamente ou fazê-lo corretamente, basta:

systemctl start systemd-tmpfiles-clean

O qual executará o comando apropriado para o seu sistema. No entanto, você deve estar ciente de que este não é um comando "excluir todos os arquivos temporários agora". Existem vários arquivos de configuração que controlam o que realmente é excluído e quando, para que os aplicativos possam configurar individualmente seus arquivos temporários.

Um local para procurar manipulação genérica de arquivos temporários pode ser o /usr/lib/tmpfiles.d/tmp.confque pode ter as seguintes linhas relevantes:

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

Você pode alterá-los para um tempo mais curto, se o seu sistema ficar sem espaço, por exemplo, para:

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

Para ter certeza do que está fazendo, man tmpfiles.dleia o manual. Mais uma vez, achei a abordagem apresentada aqui relevante em um sistema CentOS (baseado em RedHat) e Ubuntu, mas não sei muito sobre outras distribuições.

Nagev
fonte