Você pode querer tentar algo assim:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find é usado para encontrar arquivos que correspondam a determinados critérios.
-
-mtime +7
apenas seleciona arquivos com mais de 7 dias (você pode usar qualquer outro valor) -
-exec fuser -s {} ';'
chama o fusor no modo silencioso para todos os arquivos que correspondem aos critérios de oldness. O fusor retorna 0 (= true) para cada arquivo que foi acessado agora e 1 (= false) para os não acessados. Como estamos interessados apenas nos que não foram acedidos, colocamos um-not
na frente deste-exec
-
-exec echo {} ';'
apenas imprime todos os nomes de arquivos correspondentes aos critérios. talvez você queira usar-exec rm {} ';'
aqui, mas como isso pode excluir alguns arquivos ainda em uso, acho que é mais seguro fazer um eco simples primeiro. -
edit: Você pode adicionar algo como
-name 'foo*.bar'
ou-uid 123
para limitar os efeitos da limpeza a padrões de arquivo ou IDs de usuário específicos para evitar efeitos acidentais.
Para o último ponto: considere que pode haver arquivos que são gravados apenas uma vez (por exemplo, na inicialização do sistema), mas lidos com frequência (por exemplo, qualquer cookie de sessão X). Por isso, recomendo adicionar algumas verificações de nomes para afetar apenas arquivos criados por seus programas defeituosos.
edit2: À sua última pergunta: Um arquivo não será excluído do disco até que nenhum processo tenha um identificador aberto (pelo menos para sistemas de arquivos linux nativos). O problema é que a entrada de diretório é removida imediatamente, o que significa que a partir do momento em que você remover o arquivo, nenhum novo processo poderá abrir o arquivo (já que não há nenhum nome de arquivo anexado a ele).
Para detalhes, consulte: link
edit3: Mas e se eu quisesse automatizar todo o processo?
Como eu disse, pode haver arquivos que são gravados uma vez e depois lidos de vez em quando (por exemplo, cookies de sessão X, arquivos PID, etc.). Eles não serão excluídos por este pequeno script de remoção (que é a razão pela qual você pode querer fazer um teste com echo
antes de realmente deletar arquivos).
Uma maneira de implementar uma solução segura é usar atime
.
atime
armazena a hora em que cada arquivo foi acessado pela última vez. Mas essa opção do sistema de arquivos geralmente é desabilitada porque tem bastante impacto no desempenho (de acordo com este blog em algum lugar na região de 20-30%). Há relatime
, mas esse só grava o tempo de acesso se mtime
foi alterado, então este não nos ajudará.
Se você quiser usar atime
, recomendo ter /tmp
em uma partição separada (idealmente um disco virtual) para que o impacto no desempenho de todo o sistema não seja muito grande.
Quando atime
estiver habilitado, tudo o que você precisa fazer é substituir o parâmetro -mtime
na linha de comando acima por -atime
.
Você pode remover o -not -exec fuser -s {} ';'
, mas eu o manteria lá apenas para ter certeza (caso os aplicativos mantenham arquivos abertos por um longo período de tempo).
Mas lembre-se de testar o comando usando echo
antes de acabar removendo as coisas que seu sistema ainda precisa!