Você pode tentar algo assim:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find é usado para encontrar arquivos que correspondem a determinados critérios.
-mtime +7
somente 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 correspondam aos critérios de oldness. o fusor retorna 0 (= verdadeiro) para cada arquivo acessado no momento e 1 (= falso) para os não acessados. Como estamos interessados apenas nos mais acedido, nós colocamos um -not
em frente a esta-exec
-exec echo {} ';'
apenas imprime todos os nomes de arquivos que correspondem aos critérios. convém usar -exec rm {} ';'
aqui, mas como isso pode excluir alguns arquivos ainda em uso, acho mais seguro fazer um eco simples primeiro.
- editar: convém adicionar algo como
-name 'foo*.bar'
ou -uid 123
limitar os efeitos da limpeza a padrões de arquivos ou IDs de usuário específicos para evitar efeitos acidentais.
Até 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 freqüência (por exemplo, qualquer cookie de sessão X). Portanto, recomendo adicionar algumas verificações de nome para afetar apenas os arquivos criados pelos seus programas defeituosos.
edit2:
Para 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 do diretório é removida imediatamente, o que significa que a partir do momento em que você remove o arquivo, nenhum novo processo pode mais abrir o arquivo (pois não há um nome de arquivo anexado).
Para obter detalhes, consulte:
/programming/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux
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ê deve fazer um teste echo
antes de excluir os 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 de sistema de arquivos geralmente é desativada porque tem algum impacto no desempenho (de acordo com este blog em algum lugar na região de 20 a 30%). Existe relatime
, mas esse apenas escreve o tempo de acesso se mtime
tiver mudado, portanto este não nos ajudará.
Se você quiser usar atime
, eu recomendo que você tenha /tmp
uma partição separada (de preferência um ramdisk) para que o impacto no desempenho de todo o sistema não seja muito grande.
Uma vez atime
ativado, tudo o que você precisa fazer é substituir o -mtime
parâmetro 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 os arquivos abertos por um longo período de tempo).
Mas lembre-se de testar o comando echo
antes de remover as coisas que seu sistema ainda precisa!