Вы можете попробовать что-то вроде этого:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find используется для поиска файлов, которые соответствуют определенным критериям.
-mtime +7
выбирает только файлы старше 7 дней (вы можете использовать любое другое значение)
-exec fuser -s {} ';'
вызывает fuser в режиме без вывода сообщений для каждого файла, который соответствует критериям устаревания. fuser возвращает 0 (= true) для каждого файла, к которому обращались в данный момент, и 1 (= false) для недоступных. Поскольку мы заинтересованы только в unaccessed те, мы ставим -not
перед этим -exec
-exec echo {} ';'
просто печатает все имена файлов, соответствующие критериям. Вы можете использовать -exec rm {} ';'
вместо этого здесь, но так как это может удалить некоторые все еще используемые файлы, я думаю, что безопаснее сначала сделать простое эхо.
- edit: вы можете захотеть добавить что-то вроде
-name 'foo*.bar'
или -uid 123
чтобы ограничить эффекты очистки конкретными шаблонами файлов или идентификаторами пользователей, чтобы избежать случайных эффектов.
К последнему пункту: Учтите, что могут быть файлы, которые записываются только один раз (например, при загрузке системы), но часто читаются (например, любой файл X-session-cookie). Поэтому я рекомендую добавить некоторые проверки имен, чтобы они влияли только на файлы, созданные неисправными программами.
edit2: К вашему последнему вопросу: файл не будет удален с диска, пока ни у какого процесса не будет открытого дескриптора к нему (по крайней мере, для родных файловых систем linux). Проблема заключается в том, что запись в каталоге удаляется немедленно, а это означает, что с момента удаления файла новые процессы больше не смогут его открыть (поскольку к нему не прикреплено имя файла).
Для получения дополнительной информации см .:https://stackoverflow.com/questions/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux
edit3: Но что, если я хотел бы автоматизировать весь процесс?
Как я уже сказал, могут быть файлы, которые записываются один раз, а затем читаются время от времени (например, файлы cookie сеанса X, файлы PID и т.д.). Они не будут исключены этим небольшим скриптом удаления (по этой причине вам может понадобиться выполнить тестовый прогон с echo
прежде чем фактически удалять файлы).
Одним из способов реализации безопасного решения является использование atime
.
atime
хранит время последнего доступа к каждому файлу. Но эта опция файловой системы часто отключена, потому что она имеет некоторое влияние на производительность (согласно этому блогу где-то в 20-30% регионе). Есть относительное relatime
, но оно записывает время доступа только в том случае, если mtime
изменилось, так что этот нам не поможет.
Если вы хотите использовать atime
, я бы порекомендовал иметь /tmp
на отдельном разделе (в идеале, на виртуальном диске), чтобы влияние на производительность системы не было слишком большим.
После включения atime
все, что вам нужно сделать, это заменить параметр -mtime
в приведенной выше командной строке на -atime
.
Вы можете удалить -not -exec fuser -s {} ';'
, но я бы оставил его там просто для уверенности (в случае, если приложения сохраняют файлы открытыми в течение длительного периода времени).
Но имейте в виду, что нужно проверить команду с помощью echo
прежде чем вы удалите все, что нужно вашей системе!