Як безпечно очистити папку tmp в Linux


15

Для точності я використовую оперативну пам’ять для свого tmpfs / tmp, 2 Гб. Зазвичай цього достатньо, але іноді процеси створюють там файли і не вдається очистити їх після себе. Це може статися, якщо вони впадуть. Мені потрібно видалити ці осиротілі файли tmp, інакше в майбутньому процесі не вистачить місця на / tmp.

Як я можу безпечно збирати сміття / tmp? Деякі люди роблять це, перевіряючи часову позначку останньої модифікації, але такий підхід небезпечний, оскільки можуть існувати тривалі процеси, які потребують цих файлів. Більш безпечний підхід полягає в поєднанні умови останньої часової позначки модифікації з умовою, що жоден процес не має файлової обробки для цього файлу. Чи є програма / сценарій / тощо, що втілює цей підхід чи якийсь інший підхід, який також є безпечним?

Між іншим, чи дозволяє Linux / Unix режим відкриття файлів зі створенням, в якому створений файл видаляється, коли процес створення закінчується, навіть якщо він вийшов із аварії?


Перевірте, чи можете ви використовувати tmpfs замість / tmp: kernel.org/doc/Documentation/filesystems/tmpfs.txt
ott--

Відповіді:


15

Ви можете спробувати щось подібне:

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перш ніж ви закінчите видаляти речі, які ваша система все ще потребує!


приємно. Що з файлами, закритими тривалим процесом, поки вони не оновлюються? Якщо це файли контексту, ви можете втратити контекст процесу (правда, це не дуже розумний процес; але потрібно знати очікувані побічні ефекти "бічної" /tmp/очистки).
nik

У цьому полягає проблема такого підходу (як я вказував в останньому абзаці). Найкращим підходом тут буде afaik - додати перевірку шаблонів uid / gid або file (відредаговано відповіддю відповідно)
mreithub

Чи слід це помістити в сценарій cron ...?
CMCDragonkai

@CMCDragonkai Звичайно, ви можете помістити це в crontab. Але, як я вже згадував, можуть бути файли, до яких звертаються, але не записуються, і, отже, цей сценарій не може бути відфільтрований. Ось чому безпечніше спочатку роздрукувати список постраждалих файлів, а потім вирішити, видаляти їх чи ні. Якщо ви /tmpперебуваєте на окремому розділі (наприклад, ramdisk), ви можете включити atimeйого та використовувати -atimeпараметр find.
mreithub

Я планую це зробити на сервері. Тому я не можу бути там, щоб постійно рахувати всі файли в tmp. Чи будуть якісь питання? Крім того, я думав, що ми маємо на меті використовувати ретрансляцію не atime?
CMCDragonkai

4

Не котиться самостійно.

Debian / Ubuntu мають tmpreaper, він, мабуть, доступний і в інших списках.

# tmpreaper - cleans up files in directories based on their age

sudo apt-get install tmpreaper

cat /etc/tmpreaper.conf 

Якщо у /etc/tmpreaper.confфайлі я встановлю і те, /tmpі /var/tmpяк каталоги очищення, чи можна довго рекомендувати TMPREAPER_TIMEвидаляти параметр або макс. Давнє файли tmp? Я чув, що для /var/tmpфайлів краще зберігати довший вік, ніж /tmpфайли. Але якщо їх можна встановити лише з тим самим максимальним віком, я не маю підказки.
Сяодун Ци

2

Щодо останньої частини вашого запитання:

Хоча я не думаю, що режим відкриття / створення 'delete-this-if-I-die' існує, процес може безпечно видалити файл безпосередньо після його створення, доки він не відкриває ручку до цього файлу відкритою. Потім ядро ​​збереже файл на диску і як тільки завершиться останній процес, який відкрив файл (будь то в результаті аварії або в нормі), місце, яке займає файл, буде звільнено.

Для загального вирішення проблеми, що деякі процеси іноді не очищають / tmp, я б запропонував переглянути простори імен для монтування, описані, наприклад, тут чи тут . Якщо процес, про який йде мова, представляє інтерес для системного демона, systemd та його рідної функції, яка дозволяє приватним файлам / tmp.



0

Отримайте список файлів, старих, ніж так, виключайте файли, відкриті чим-небудь із цього списку:

find /tmp -mtime +7 |\
    egrep -v "`lsof -n +D /tmp | awk 'NR>1 {print $9}'| tr \\n \|`" 

lsof -n +D /tmp: шукайте відкриті файли в / tmp
awk 'NR>1 {print $9}': друкуйте лише дев'ятий стовпець lsof виводу, виключаючи заголовки
tr \\n \|: замініть новий рядок рядком (АБО в egrep)
egrep -v "foo|moo|bar": друкуйте рядки, які НЕ містять foo, moo або bar


0

Я погоджуюся з вищезазначеним, щоб додати його, хоча- я завжди запускаю lsof +L1 | grep tmpабо вбиваю, або перезавантажую процеси, що тримаються на "видалених" файлах tmp: ПРИКЛАД-

# lsof +L1 | grep tmp
xfce4-ter  1699  user   32u   REG    8,6      192     0 818552 /tmp/vte966VLX (deleted)
chrome     3301  user  138u   REG    8,6    16400     0 818547 /tmp/etilqs_Z0guKD7p6ork9iG (deleted)

2
СУ випадково впорядковує пости - так що немає ні вгорі, ні внизу. На яку посаду ви посилаєтесь?
Подорожник Geek

0

Можна просто зробити rm -rf /tmp/*і сподіватися, що нічого не зламається ...


1
Запропонувати зробити щось "і сподіваюся, що нічого не зламається" насправді не відповідає "ОП", чи є безпечний спосіб зробити це. Можливо, ви могли б детальніше пояснити, чому ваша пропозиція безпечна?
bertieb

@bertieb Добрий момент. Я думаю, це, мабуть, безпечно, якщо він не працює як root, але ...
Соломон Учко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.