Как очищается каталог / tmp?

301

Как /tmpочищается каталог? Это автоматически? Если так, как часто это убирается?

Оливье Лалонд
источник
15
Мои временные файлы никогда не записываются на диск. Они записываются на RAM-диск. Я положил tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0в / etc / fstab.
Аноним
Связанный: serverfault.com/questions/377348/when-does-tmp-get-cleared/...
Чиро Сантилли新疆改造中心法轮功六四事件

Ответы:

192

Запись! Этот ответ устарел, по крайней мере, с Ubuntu 14.04. Смотрите другие ответы для текущей ситуации, и если они окажутся правильными, то яростно проголосуйте за них. Также оставьте комментарий, чтобы я мог поставить ссылку здесь на текущий правильный ответ.

Для 14.04 см. Https://askubuntu.com/a/759048/1366.

За 16.10 см. Https://askubuntu.com/a/857154/453746.


Старый ответ от 2011 года:

Очистка /tmpвыполняется сценарием выскочки /etc/init/mounted-tmp.conf. Скрипт запускается upstart при каждом /tmpмонтировании. Практически это означает при каждой загрузке.

Сценарий выполняет примерно следующее: если файл /tmpстарше, чем $TMPTIMEдни, он будет удален.

Значение по умолчанию равно $TMPTIME0, что означает, что каждый файл и каталог в нем /tmpудаляются. $TMPTIMEпеременная среды, определенная в /etc/default/rcS.

lesmana
источник
Это больше не относится к 14.04 (скрипт больше не существует).
Мартин Шредер,
@Martin Schröder - скрипт существует в моей системе, и это чистая установка 14.04, а tmpreaper не существует!
Лэнс Холланд
Я использую Arch Linux сейчас, поэтому я не могу проверить. Сожалею. Пожалуйста, кто-нибудь подтвердит это и прокомментирует или отредактирует мой ответ.
Lesmana
4
в Ubuntu 16.04 tmpreaper заброшен как небезопасный, пожалуйста, смотрите: fossies.org/linux/tmpreaper/debian/README.security
tamerlaha
1
Нет. В Ubuntu 16.04 его просто заменяет механизм systemd. Прочтите этот документ, и вы действительно найдете объяснение того, почему анализ безопасности, утверждающий, что небезопасен, ошибочен.
JdeBP
141

Каталог очищается по умолчанию при каждой загрузке, потому что TMPTIMEпо умолчанию 0.

Здесь вы можете изменить время в следующем файле:

/etc/default/rcS

TMPTIME говорит, как часто tmp dir должен очищаться в днях

Макс Руф
источник
9
Очистка при каждой загрузке не идеальна для машины, которая никогда не перезагружается, например, для сервера. У меня более 500 000 файлов, занимающих 5 Гб пространства в моей / tmp, потому что мой сервер работает без подзарядки 378 дней. Я не хочу его перезагружать просто потому, что очистка этих файлов при перезагрузке занимает несколько часов.
Rjmunro
10
В вашем случае вы должны дать tmpreaperшанс.
QBi
1
Работа CRON может легко решить это.
Кен Шарп
Также tmpwatchдолжен быть соответствующий инструмент.
АрекБульски
1
Похоже, Ubuntu / systemd уже предоставляет решение. Я бы сказал больше, но .... systemd.
Кен Шарп
65

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

Изменение /tmpчастоты очистки

Параметр по умолчанию, который указывает вашей системе очистить /tmpпри перезагрузке, хранится в /etc/default/rcSфайле. Значение , которое мы будем смотреть на это TMPTIME.

Текущее значение TMPTIME=0говорит об удалении файлов при перезагрузке, несмотря на возраст файла. Изменение этого значения на другое (положительное) число изменит количество дней, в течение которых файл может выжить /tmp.

TMPTIME=7

Этот параметр позволит файлам оставаться /tmpдо тех пор, пока им не исполнится неделя, а затем удалит их при следующей перезагрузке. Отрицательное число ( TMPTIME=-1) указывает системе никогда ничего не удалять в /tmp. Это, вероятно, не то, что вы хотите, но доступно.

hhlp
источник
1
хорошее объяснение. Но в каком скрипте есть команда очистки? Я видел /etc/init/mounted-temp.conf, но у этого есть линия, start on mounted MOUNTPOINT=/tmpкоторая заставляет меня думать, что это не применимо.
энзотиб
7
Если вы не хотите, чтобы файл удалялся автоматически, вставьте его /var/tmpвместо /tmp.
Жиль
1
Также удобно хранить файлы, которые вы не хотите терять (визуализированные видеокадры) при сбое вашей машины, возможно, из-за OOM. Конечно, лучшим решением было бы решить проблему. :-)
Кен Шарп
Можно ли это сделать внутри Cygwin?
CMCDragonkai
46

Я проверяю это на Ubuntu 16.10. Я могу подтвердить, что редактирование / etc / default / rcS больше не имеет никакого эффекта, и файлы в tmp стираются при перезагрузке, независимо от того, что вы вставили в этот файл. Как уже упоминалось, tmpreaper больше не используется.

Я думаю, что правильный ответ заключается в том, что Ubuntu 16.10 имеет новую настройку. Существует папка /etc/tmpfiles.d, документированная на странице руководства "tmpfiles.d". В эту папку необходимо поместить файл конфигурации, чтобы контролировать, нужно ли удалять / tmp. Это то, что я делаю, чтобы мешать перезагрузкам стирать файлы в / tmp, если им не исполнилось 20 дней:

#/etc/tmpfiles.d/tmp.conf

d /tmp 1777 root root 20d

Замените «20d» на «-», если вы не хотите, чтобы файлы были удалены. Это мое лучшее усилие, эта страница руководства почти непроницаема с деталями.

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

pauljohn32
источник
5
man tmpfiles.d
Мартин Шредер,
Я обнаружил, что вы можете сохранить исходные права доступа к файлу и владельца, используя дефисы:d /tmp/ - - - 20d
Дейв Ярвуд
2
Также стоит отметить: вы можете проверить свою конфигурацию, запустив задание на очистку вручную:systemctl start systemd-tmpfiles-clean
Дейв Ярвуд
@ pauljohn32 это также верно для версий после 16.10?
августа
3
@kapad: Я только что убедился, что это работает и в Ubuntu 18.04.
Джин Винсент
26

В Ubuntu 14.04 это делается с помощью tmpreaperежедневного cron (from /etc/cron.daily). Программу можно настроить через /etc/default/rcSи /etc/tmpreaper.conf.

Мартин Шредер
источник
в моей системе tmpreaper не было в /etc/cron.daily - но я смог установить его с помощью apt-get
Joe Germuska
10

До 14.04:

Он очищается каждый раз при перезагрузке.

Утку Демир
источник
Появляется с 14.04+, использует только tmpreaper, а не скрипт "per boot". FWIW
rogerdpack
Мои системы 14.04 все очищаются при перезагрузке. Никогда даже не слышал о tmpreaper.
Кен Шарп
Что делать, если вы никогда не перезагрузите систему?
phuclv
8

В systemdUbuntu (15.10 и новее) это делается systemd с использованием systemd-tmpfiles-cleanсервиса и таймера:

$ systemctl cat systemd-tmpfiles-clean.service 
# /lib/systemd/system/systemd-tmpfiles-clean.service
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=local-fs.target time-sync.target
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/bin/systemd-tmpfiles --clean
IOSchedulingClass=idle

А также

$ systemctl cat systemd-tmpfiles-clean.timer  
# /lib/systemd/system/systemd-tmpfiles-clean.timer
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

Так systemd-tmpfiles-cleanработает при выключении, а один раз в день иначе. Очищаемые файлы могут быть расширены с использованием /etc/tmpfiles.dупомянутых в другом ответе .

Вы можете сами изменить поведение таймера systemctl edit systemd-tmpfiles-clean.timer, используя различные Timerпараметры конфигурации systemd (см. man 5 systemd.timer).

Мур
источник
Я изменил таймер на 20 минут, и я вижу, что команда состояния показывает, что на самом деле используется конфигурация 20 минут. но моя проблема в том, что /tmpдо сих пор не убрали. и мне нужно его почистить. даже ручной запуск sudo systemctl start systemd-tmpfiles-cleanне помогает. Есть идеи почему?
user2932688
4

На одном из наших серверов под управлением Ubuntu у нас есть скрипт для удаления файлов в / tmp, и он работает ночью.

Сценарий:

#!/bin/sh
# Clean file and dirs more than 3 days old in /tmp nightly

/usr/bin/find /tmp -type f -atime +2 -mtime +2  |xargs  /bin/rm -f &&

/usr/bin/find /tmp -type d -mtime +2 -exec /bin/rm -rf '{}' \; &&

/usr/bin/find /tmp -type l -ctime +2 |xargs /bin/rm -f &&

/usr/bin/find -L /tmp -mtime +2 -print -exec rm -f {} \;

Просто сохраните содержимое выше в файл chmod 775 файл и создайте запись cron для его запуска. Поскольку это веб-сервер, мы не хотим его перезагружать по понятным причинам.

Павел
источник
6
Возможно, вам лучше использовать tmpwatch .
Poolie
9
Последняя строка чрезвычайно опасна. Обычно каждый может бежать ln -s /usr /tmp/kaboomили даже ln -s /* /tmp/...
Даниэль Олдер