Вы можете попробовать что-то вроде этого:
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перед тем, как вы удалите все, что нужно вашей системе!