Devemos excluir manualmente o conteúdo de / tmp?

26

Tive a impressão de que arquivos "antigos" em /tmp serão excluídos regularmente. No entanto, parece-me que /tmp vai crescer o quanto quiser, e nada será deletado. Algumas pessoas dizem que é melhor deixar /tmp sozinho e excluir seu conteúdo somente se o disco estiver cheio.

Minha pergunta é: /tmp é realmente projetado para não se cuidar? Quais são as melhores práticas?

    
por IMB 12.04.2013 / 21:56

8 respostas

27

Para responder às perguntas:

  • O /tmp deve ser esvaziado automaticamente: Sim
  • Devemos excluir Arquivos em /tmp de forma regular e manual: Não , seu sistema cuidará deles.

Se você se perguntar:

  • Posso excluir arquivos de /tmp por qualquer motivo (precisar de espaço, desejar remover rastreamentos, etc.): Depende , leia em .

Padrão de hierarquia do sistema de arquivos (FHS) estados :

The /tmp directory must be made available for programs that require temporary files.

Programs must not assume that any files or directories in /tmp are preserved between invocations of the program.

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

Não é garantido que /tmp/ ou /var/tmp/ sejam limpos regularmente. Isso pode depender da sua distribuição e configurações, embora a maioria dos sistemas faça alguma limpeza de tempos em tempos. Consulte comentário por mike .

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

lsof /tmp/file_to_delete

Se você tiver direitos para fazer isso, isso mostrará o processo que contém o identificador para esse arquivo, como nome do processo, PID e tipo do arquivo. Para mostrar realmente todos os processos, prefixar sudo ou executar como usuário root .

lsof +D /tmp

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

Na verdade, quando você exclui um arquivo que ainda está aberto - se tiver os direitos para fazer isso - ele fica inacessível a partir do namespace do sistema de arquivos, mas ele ainda existe para os processos que possuem um identificador de arquivo aberto. . Depois de fechar esse identificador, o arquivo não está mais acessível para esse processo e, se nenhum processo tiver o arquivo aberto, ele será finalmente excluído. Um processo não deve supor que o arquivo sobrevive entre as chamadas open subseqüentes, mas os programadores são desleixados e você nunca sabe. Por essa razão, não é tão inteligente excluir arquivos que ainda estão sendo usados por alguns programas.

    
por 26.07.2013 / 14:52
4

Eu acho que isso é dependente de variância OS. 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, já que ele não saberia quais arquivos estão ativos.

Se você é corajoso, pode querer lançar um comando no crontab, que exclui arquivos com mais de uma certa idade, mas isso pode causar alguns problemas se excluir 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 com menos de 10 dias em / tmp.

    
por 12.04.2013 / 22:19
1

Os diretórios / tmp e / var / tmp são limpos em um agendamento normal. Isso pode depender da sua distro. No meu sistema CentOS (um clone do RedHat) existe um cron job agendado para executar tmpwatch , um tmp dir cleaner , em um programa diário . Os arquivos em / var / tmp podem ficar um pouco mais longos que os arquivos em / tmp /. Eu também vi scripts que apagam / tmp (mas explicitamente não são / var / tmp) em uma reinicialização, sabendo que não pode haver nada mantendo esse arquivo aberto, já que todos os processos são novos.

Então, sim, / tmp tem manutenção de scripts básicos. Ainda pode encher-se fora desses tempos de manutenção. Se você escolheu limpar as coisas manualmente, a melhor prática de sysadmin é ter cuidado. Sysadmin lore fala sobre links simbólicos em / tmp apontando para arquivos de sistema necessários que foram apagados quando o n00b sysadmins executou um simples script find .

    
por 12.04.2013 / 22:56
1

No CentOS, há um trabalho em /etc/cron.daily chamado tmpwatch , que removerá recursivamente arquivos que não foram acessados por um determinado período. Normalmente, é usado para limpar diretórios que são usados para espaços temporários como / tmp.

Este é o script /etc/cron.daily/tmpwatch

#! /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
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
        /usr/sbin/tmpwatch "$flags" -f 30d "$d"
    fi
done

O conteúdo do diretório

/tmp é excluído somente quando o sistema é reinicializado, porque o processo em execução pode ter acesso aos arquivos desse diretório.

    
por 13.04.2013 / 06:29
0

Você pode remover o conteúdo de /tmp/ ; mas o problema de fazer isso é que, se você tiver um serviço que grava regularmente em /tmp/ e excluir os arquivos, o serviço poderá travar ou quebrar até que seja reiniciado.

    
por 12.04.2013 / 22:17
0

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

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

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

    
por 12.04.2013 / 22:44
0

Se você está usando Debian (ou um derivado como o Ubuntu) você deve olhar para o seu / etc / default / rcS e ajuste a variável de ambiente TMPTIME . Por definição, o que reside em / tmp não tem nada para fazer aqui na próxima reinicialização.

Eu recomendo

  • usando a variável TMPTIME em um servidor
  • mount / tmp como tmpfs (in ram) em um desktop (para mais velocidade)
por 12.04.2013 / 22:19
0

As distribuições são diferentes, mas espero que arquivos temporários sejam gerenciados automaticamente pelo sistema. Eles provavelmente usariam tarefas agendadas ou o serviço systemd-tmpfiles-clean. Se você está preocupado com o espaço em disco, este é um comando útil para observar quanto espaço cada pasta raiz está usando:

du -hs /* | sort -h

Para ver se seu sistema está usando o serviço systemd para gerenciar arquivos temporários, tente:

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 esse serviço será encerrado assim que for concluído com a limpeza. Um serviço de timer é responsável por acioná-lo regularmente. Você pode verificar 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 responsável pela limpeza dos arquivos, verá que tudo o que ele faz é executar:

/usr/bin/systemd-tmpfiles --clean

Para que você possa executar esse comando diretamente ou fazer isso corretamente, faça o seguinte:

systemctl start systemd-tmpfiles-clean

O qual executará o comando apropriado para o seu sistema. No entanto, você deve estar ciente de que esse 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 os aplicativos podem configurar individualmente seus arquivos temporários.

Um local para procurar manipulação genérica de arquivos temporários pode ser /usr/lib/tmpfiles.d/tmp.conf , que 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 menor, se o sistema continuar sem espaço, por exemplo, para:

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

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

    
por 19.07.2018 / 11:45