Ми повинні видалити вміст / tmp вручну?


26

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

Моє запитання: чи /tmpсправді покликаний не піклуватися про себе? Які найкращі практики?


1
зазвичай /tmpочищається після перезавантаження, але це залежить від встановленої там файлової системи. Що df -hговорить?
etagenklo

Відповіді:


27

Щоб відповісти на запитання:

  • Є чи /tmpмає бути звільнено автоматично: Так
  • Чи слід видаляти файли /tmpрегулярно та вручну: Ні , ваша система буде піклуватися про них.

Якщо ви можете запитати себе:

  • Чи можу я видалити файли з /tmpбудь-якої причини (потрібен простір, хочете видалити сліди тощо): Це залежить , читайте далі .

Стандарт ієрархії файлової системи (FHS) зазначає :

Програми / tmp повинні бути доступними для програм, які потребують тимчасових файлів.

Програми не повинні припускати, що будь-які файли чи каталоги в / tmp зберігаються між викликами програми.

/var/tmp/має аналогічне призначення , але його не слід видаляти під час перезавантаження.

Це не гарантує , що /tmp/або /var/tmp/забирається на регулярній основі. Це може залежати від вашого розповсюдження та налаштувань, хоча більшість систем час від часу проводять чистку. Дивіться коментар від mike.

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

lsof /tmp/file_to_delete

Якщо у вас є права на це, це покаже процес, який тримає ручку до цього файлу, як ім'я процесу, PID та тип файлу. Щоб показати дійсно всі процеси, додайте sudoабо запустіть як root користувача .

lsof +D /tmp

покаже всі файли /tmpта каталоги нижче ( +D), які зараз відкриті. Звичайно, ви не повинні видаляти ці файли.

Насправді, коли ви видаляєте файл, який все ще відкривається - якщо у вас є права на це - він стає недоступним з простору імен файлової системи, але він все ще існує для процесів, які мають для цього відкриту файлову обробку. Закривши цю ручку, файл уже не доступний для цього процесу, і якщо жоден процес більше не відкриває файл, він остаточно видаляється. Процес не повинен припускати, що файл зберігається між наступними openдзвінками, але програмісти неохайні, і ви ніколи не знаєте. З цієї причини не так розумно видаляти файли, які все ще використовуються деякими програмами.


Загалом це все чудові поради, особливо останній абзац. Але чи буде система насправді очищати / tmp, залежить від цієї системи. Наприклад, в OpenSUSE, це робить НЕ , якщо не налаштувати його (с / і т.д. / sysconfig, або з допомогою YaST). Також особистий ~ / tmp користувача (якщо він є) не очищається автоматично.
Майк

Тож все-таки можна видалити файли, у яких відкриті процеси? І це не руйнує програму? Де тоді існує файл? Чи може програма ще взаємодіяти з цим "відкритим, але одночасно видаленим" файлом? Чи є якийсь спосіб ускладнити чи неможливо rm видалити файл? Можливо, щось на кшталт блокування файлів?
CMCDragonkai

Файли - це набори даних у файловій системі, які робляться доступними в ієрархічному просторі імен через шлях та ім’я файлу. Файл може мати кілька імен (жорсткі посилання), а процес може мати відкриту ручку для файлу. Якщо файл недоступний, тобто, коли він не має імені та немає відкритої ручки, він видаляється. Запобігання видаленню виходить за рамки мого досвіду, а ІМО виходить за рамки цього питання. Спробуйте шукати "замовлення на замовлення".
трапічки

[була
дублююча

4

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

Якщо ви сміливі, ви можете запустити команду в crontab, яка видаляє файли старше певного віку, але це може спричинити деякі проблеми, якщо вони видалять файли, які все ще використовуються. Ви можете спробувати команду (я її не пробував), як

find / tmp -тип f -ctime +10 -exec rm {} +

Що теоретично видалить усі файли під / tmp старше 10 днів.


слід, мабуть, додати -rдо цього
Стівен Пенні

1
Абсолютно НЕ додайте -r до цього - це матиме ефект або видалятиме файли менше 10 днів, де вони існують у каталогах, створених більше 10 днів тому. Насправді команда, ймовірно, повинна знайти / tmp -тип f -ctime +10 -exec rm {} + для обмеження пошуку файлів. (Використання команди find буде повторювати підкаталоги)
davidgo

1

Каталоги / tmp та / var / tmp очищаються за звичайним графіком. Це може залежати від вашого дистрибутива. У моїй системі CentOS (клон RedHat) є робота cron, призначена для запуску tmpwatch , очищувача dir dir, на щоденному графіку . Файли в / var / tmp можуть триматися трохи довше, ніж файли в / tmp /. Я також бачив сценарії, які prune / tmp (але явно не / var / tmp) під час перезавантаження, знаючи, що цей файл не може бути відкритим, оскільки всі процеси нові.

Отже, так, / tmp має підтримку основних сценаріїв. Він все ще може заповнитись поза тим часом технічного обслуговування. Якщо ви вирішили чистити речі вручну, найкраща практика системного управління - це бути обережними. Sysadmin lore розповідає про символьні посилання в / tmp, вказуючи на необхідні системні файли, які були видалені, коли n00b sysadmins виконував простий findсценарій.


2
У Centos 7 та інших системах, схожих на RedHat версії 7+ з системою, очищення налаштовано в /usr/lib/tmpfiles.d/tmp.conf. На це викликається цільовий systemd-tmpfiles-clean.service.
приголомшливий користувач Linux

1

У CentOS є робота в /etc/cron.dailyтелефоніtmpwatch яке яке буде рекурсивно видаляти файли, які не були доступні протягом певного часу. Зазвичай він використовується для очищення каталогів, які використовуються для тимчасового простору, наприклад / tmp.

Це /etc/cron.daily/tmpwatch сценарій

#! / бін / ш
прапори = -umc
/ usr / sbin / tmpwatch "$ прапори" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
        -X '/ tmp / hsperfdata_ *' 10d / tmp
/ usr / sbin / tmpwatch "$ прапори" 30d / var / tmp
для d in / var / {cache / man, catman} / {cat ?, X11R6 / cat?, local / cat?}; робити
    if [-d "$ d"]; потім
        / usr / sbin / tmpwatch "$ прапори" -f 30d "$ d"
    фі
зроблено

/tmp Вміст каталогів видаляється лише при перезавантаженні системи, оскільки запущений процес може мати доступ до файлів із цього каталогу.


0

Ви можете видалити вміст з /tmp/; але проблема з цим полягає в тому, що якщо у вас є служба, яка регулярно записує /tmp/і видаляє файли, ви можете зробити службу збоєм або розривом до її перезапуску.


0

FHS визначає /tmpкаталог в якості «тимчасових файлів (також див / УАГ / TMP), часто не зберігається між перезавантаженнями системи», а /var/tmpтакож «тимчасові файли повинні бути збережені між перезавантаженнями».

На сьогоднішній день /tmpфайлова система RAM (tmpfs) за замовчуванням (хоча і необов'язково) у багатьох дистрибутивах GNU / Linux, /tmpфактично не є стійкою.

(Напевно) програми повинні відповідно керувати тимчасовими файлами, що, на мою думку, включає їх видалення після закінчення їх використання, а не вимагати від адміністраторів планувати можливі деструктивні видалення.


Багато програм можуть зробити набагато кращу роботу з очищення файлів, /tmpколи вони зроблені з ними або коли вони закриваються, але все ще існує проблема файлів, що залишилися /tmpпісля аномального припинення (збоїв) програми.
Кевін Феган

0

Якщо ви використовуєте Debian (або похідну типу Ubuntu), слід переглянути файл / etc / default / rcS та відрегулювати TMPTIMEзмінну середовища. За визначенням, що резидент / tmp тут не має нічого робити при наступному перезавантаженні.

я рекомендую

  • за допомогою TMPTIMEзмінної на сервері
  • монтуйте / tmp як tmpfs (у таран) на робочому столі (для більшої швидкості)

0

Звичайно, дистрибуції різні, але я очікую, що тимчасові файли будуть автоматично керуватися системою поза вікном. Вони, ймовірно, будуть використовувати або завдання cron, або службу очищення systemd-tmpfiles. Якщо ви турбуєтесь про місце на диску, це корисна команда, щоб переглянути, скільки місця займає кожна коренева папка:

du -hs /* | sort -h

Щоб побачити, чи ваша система використовує службу systemd для управління тимчасовими файлами, ви можете просто спробувати:

systemctl status systemd-tmpfiles-clean

Внизу ви побачите щось на кшталт наступного, яке повідомляє про те, коли послуга востаннє виконувалася:

systemd-tmpfiles-clean.service - Cleanup of Temporary Directories
   Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.service; static; vendor preset: disabled)
   Active: inactive (dead) since Wed 2018-07-18 15:43:36 IST; 18h ago
     Docs: man:tmpfiles.d(5)
           man:systemd-tmpfiles(8)
  Process: 30495 ExecStart=/usr/bin/systemd-tmpfiles --clean (code=exited, status=0/SUCCESS)
 Main PID: 30495 (code=exited, status=0/SUCCESS)

Jul 18 15:43:36 host-name systemd[1]: Starting Cleanup of Temporary Directories...
Jul 18 15:43:36 host-name systemd[1]: Started Cleanup of Temporary Directories.

Зауважте, що ця послуга буде закрита, як тільки вона буде виконана з очищенням. Служба таймеру відповідає за регулярне його запуску. Ви можете перевірити це за допомогою:

systemctl status systemd-tmpfiles-clean.timer

І слід очікувати чогось такого:

systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
   Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled)
   Active: active (waiting) since Tue 2018-07-03 10:56:59 IST; 2 weeks 1 days ago
     Docs: man:tmpfiles.d(5)
           man:systemd-tmpfiles(8)

Jul 03 10:56:59 host-name systemd[1]: Started Daily Cleanup of Temporary Directories.
Jul 03 10:56:59 host-name systemd[1]: Starting Daily Cleanup of Temporary Directories.

Якщо ви знову подивитесь на фактичну службу, відповідальну за очищення файлів, ви побачите, що все, що вона робить, виконується:

/usr/bin/systemd-tmpfiles --clean

Отже, ви можете або запустити цю команду безпосередньо, або виконати її правильно, просто зробіть:

systemctl start systemd-tmpfiles-clean

Яка запустить відповідну команду для вашої системи. Однак слід пам’ятати, що це не команда «видалити всі тимчасові файли зараз». Існує кілька файлів конфігурації, які керують тим, що насправді видаляється, а також коли додатки можуть індивідуально конфігурувати свої тимчасові файли.

Одне місце для пошуку загальної обробки тимчасових файлів могло /usr/lib/tmpfiles.d/tmp.confб мати такі відповідні рядки:

# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d

Ви можете змінити їх на коротший час, якщо, наприклад, у вашій системі не вистачає місця:

v /tmp 1777 root root 12h
v /var/tmp 1777 root root 1d

Щоб бути впевненим у тому, що ви робите, man tmpfiles.dпрочитайте посібник. Знову я виявив, що представлений тут підхід є релевантним для CentOS (на основі RedHat) та системи Ubuntu, але я не знаю багато про інші дистрибутиви.

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