Ви можете спробувати щось подібне:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find використовується для пошуку файлів, що відповідають певним критеріям.
-mtime +7
вибирає лише файли, старші 7 днів (ви можете використовувати будь-яке інше значення)
-exec fuser -s {} ';'
викликає фюзер у беззвучному режимі для кожного файлу, який відповідає критеріям старості. fuser повертає 0 (= true) для кожного файлу, до якого зараз доступ, та 1 (= false) для недоступних. Оскільки нас цікавлять лише невикористані, ми ставимо -not
перед цим-exec
-exec echo {} ';'
просто друкує всі назви файлів, що відповідають критеріям. ви можете -exec rm {} ';'
замість цього використати , але оскільки це може видалити деякі ще використовувані файли, я вважаю, що безпечніше спочатку зробити просте ехо.
- редагувати: Ви можете додати щось на кшталт
-name 'foo*.bar'
або -uid 123
обмежити ефекти очищення певними шаблонами файлів або ідентифікаторами користувачів, щоб уникнути випадкових ефектів.
До останнього пункту: Подумайте, що можуть бути файли, які записуються лише один раз (наприклад, при завантаженні системи), але читаються часто (наприклад, будь-який cookie X-сеансу). Тому я рекомендую додавати кілька перевірок імен, щоб впливати лише на файли, створені вашими несправними програмами.
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
на окремому розділі (в ідеалі - ramdisk), щоб вплив на продуктивність всієї системи був не надто великим.
Після atime
ввімкнення все, що вам потрібно зробити, - це замінити -mtime
параметр у наведеному вище командному рядку на -atime
.
Можливо, ви зможете видалити цей -not -exec fuser -s {} ';'
файл, але я зберігаю його там лише для впевненості (якщо програми тривають тривалий час відкритими файли).
Але майте на увазі, щоб протестувати команду, echo
перш ніж ви закінчите видаляти речі, які ваша система все ще потребує!