Вы можете попробовать что-то вроде этого:
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) для недоступных. Поскольку нас интересуют только недоступные, мы ставим -not
перед этим-exec
-exec echo {} ';'
просто печатает все имена файлов, соответствующие критериям. вы можете использовать -exec rm {} ';'
вместо этого здесь, но так как это может удалить некоторые все еще используемые файлы, я думаю, что безопаснее сначала сделать простое эхо.
- редактировать: вы можете захотеть добавить что-то подобное
-name 'foo*.bar'
или -uid 123
ограничить эффекты очистки конкретными шаблонами файлов или идентификаторами пользователей, чтобы избежать случайных эффектов.
К последнему пункту: Учтите, что могут быть файлы, которые записываются только один раз (например, при загрузке системы), но часто читаются (например, любой файл X-session-cookie). Поэтому я рекомендую добавить некоторые проверки имен, чтобы они влияли только на файлы, созданные неисправными программами.
edit2:
К вашему последнему вопросу: файл не будет удален с диска, пока ни у одного процесса не будет открытого дескриптора (по крайней мере, для родных файловых систем linux). Проблема заключается в том, что запись в каталоге удаляется немедленно, а это означает, что с момента удаления файла новые процессы не смогут открыть файл (так как к нему не прикреплено имя файла).
Подробности см .:
/programming/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
перед тем, как вы удалите все, что нужно вашей системе!