Мы должны вручную удалить содержимое / tmp?

26

У меня сложилось впечатление, что «старые» файлы /tmpбудут регулярно удаляться. Однако, мне кажется, что он /tmpбудет расти столько, сколько захочет, и ничего не будет удалено. Некоторые люди говорят, что лучше оставить в /tmpпокое и удалить его содержимое, только если диск заполнен.

У меня вопрос, /tmpдействительно ли он создан, чтобы не заботиться о себе? Каковы лучшие практики?

IMB
источник
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вызовами, но программисты небрежны, и вы никогда не узнаете. По этой причине не очень разумно удалять файлы, которые все еще используются некоторыми программами.

trapicki
источник
В общем, это все отличные советы, особенно последний абзац. Но то, действительно ли система выполняет очистку / tmp, зависит от этой системы. Например, в openSUSE это не так , если вы не настроите его (из / etc / sysconfig или через YaST). Кроме того, личные ~ / tmp пользователей (если они есть) не очищаются автоматически.
май
Так что все еще можно удалить файлы, которые открыты процессами? И это не приводит к краху программы? Где этот файл существует тогда? Может ли программа по-прежнему взаимодействовать с этим «открытым, но одновременно удаленным» файлом? Есть ли какой-нибудь способ затруднить или сделать невозможным удаление файла? Возможно, что-то вроде блокировки файла?
CMCDragonkai
Файлы - это наборы данных в файловой системе, которые становятся доступными в иерархическом пространстве имен посредством пути и имени файла. Файл может иметь несколько имен (жестких ссылок), и процесс может иметь открытый дескриптор файла. Если файл недоступен, то есть когда у него нет имени и открытого дескриптора, он удаляется. Предотвращение удаления выходит за рамки моей компетенции, и IMO выходит за рамки этого вопроса. Попробуйте найти «мандатную блокировку».
trapicki
[был
двойной
4

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

Если вы смелы, вы можете добавить команду в crontab, которая удаляет файлы старше определенного возраста, но это может вызвать некоторые проблемы, если она удаляет файлы, которые все еще используются. Вы можете попробовать команду (я не пробовал), как

find / tmp -type f -ctime +10 -exec rm {} +

Который теоретически удалит все файлы в / tmp старше 10 дней.

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

Каталоги / tmp и / var / tmp очищаются по обычному расписанию. Это может зависеть от вашего дистрибутива. В моей системе CentOS (клон RedHat) есть хрон работу планируется запустить tmpwatch , а TMP реж уборщика, на ежедневный график . Файлы в / var / tmp могут храниться немного дольше, чем файлы в / tmp /. Я также видел сценарии, которые сокращают / tmp (но явно не / var / tmp) при перезагрузке, зная, что не может быть ничего, что удерживает этот файл открытым, так как все процессы новые.

Так что да, / tmp имеет поддержку из основных скриптов. Это все еще может заполнить вне тех времен обслуживания. Если вы решили чистить вещи вручную, лучше всего быть осторожным сисадмином. История системного администратора говорит о символических ссылках в / tmp, указывающих на необходимые системные файлы, которые были удалены, когда системные администраторы n00b запустили простой findсценарий.

Рич Гомолка
источник
2
На Centos 7 и других подобных RedHat системах версии 7+ с systemd очистка настраивается в /usr/lib/tmpfiles.d/tmp.conf. Это вызывается целевой системой systemd-tmpfiles-clean.service.
shonky пользователь linux
1

На CentOS есть работа в /etc/cron.dailyназывается , tmpwatchкоторый будет рекурсивно удаляет файлы , которые не получили доступ в течение заданного времени. Обычно он используется для очистки каталогов, которые используются для временного хранения, например / tmp.

Это /etc/cron.daily/tmpwatchскрипт

#! / Бен / ш
флаги = -umc
/ usr / sbin / tmpwatch "$ flags" -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 "$ flags" 30d / var / tmp
для d в / var / {cache / man, catman} / {cat?, X11R6 / cat?, local / cat?}; делать
    if [-d "$ d"]; тогда
        / usr / sbin / tmpwatch "$ flags" -f 30d "$ d"
    фи
сделанный

/tmp содержимое каталога удаляется только при перезагрузке системы, поскольку запущенный процесс может иметь доступ к файлам из этого каталога.

Максимум
источник
0

Вы можете удалить контент из /tmp/; но проблема при этом заключается в том, что если у вас есть служба, которая регулярно пишет /tmp/и удаляет файлы, вы можете вызвать сбой или поломку службы до ее перезапуска.


источник
0

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

В настоящее время, /tmpпоскольку файловая система ОЗУ (tmpfs) по умолчанию (хотя и необязательная) во многих дистрибутивах GNU / Linux, /tmpфактически непостоянна.

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

Дауд
источник
Многие программы могут гораздо лучше справляться с очисткой файлов, /tmpкогда они /tmpзавершают работу с ними или когда они выходят, но все еще существует проблема с файлами, оставшимися после ненормального завершения (сбоя) программы.
Кевин Феган
0

Если вы используете Debian (или его производную, например, Ubuntu), вы должны взглянуть на файл / etc / default / rcS и настроить TMPTIMEпеременную окружения. По определению, то, что находится в / tmp, не имеет никакого отношения к следующей перезагрузке.

рекомендую

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

Разумеется, дистрибутивы разные, но я ожидаю, что система будет автоматически управлять временными файлами автоматически. Скорее всего, они будут использовать либо задания cron, либо службу systemd-tmpfiles-clean. Если вы беспокоитесь о дисковом пространстве, это полезная команда, чтобы посмотреть, сколько места занимает каждая корневая папка:

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, но я не знаю много о других дистрибутивах.

Nagev
источник