26

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

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

8 ответов8

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

4

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

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

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

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

1

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

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

1

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

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

#! /bin/sh
flags=-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
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
        /usr/sbin/tmpwatch "$flags" -f 30d "$d"
    fi
done

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

0

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

рекомендую

  • использование переменной TMPTIME на сервере
  • mount /tmp как tmpfs (в оперативной памяти) на рабочем столе (для большей скорости)
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, но я не знаю много о других дистрибутивах.

0

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

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

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .