Як очищається каталог / tmp?


300

Як /tmpочищається каталог? Це автоматично? Якщо так, то як часто це прибирається?


15
Мої тимчасові файли ніколи не записуються на диск. Вони записуються на диск RAM. Я поставив tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0/ etc / fstab.
Анонім

Відповіді:


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. Сценарій виконується на початку, кожен раз, коли /tmpвстановлено. Практично це означає при кожному завантаженні.

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

Значення за замовчуванням $TMPTIME- 0, що означає, що кожен файл та каталог у файлі /tmpвидаляються. $TMPTIME- змінна середовища, визначена в /etc/default/rcS.


Це вже не вірно для 14.04 (сценарій вже не існує).
Мартін Шредер

@Martin Schröder - скрипт існує в моїй системі, і це чиста установка 14.04, а tmpreaper не існує!
Lance Holland

Зараз я використовую arch linux, тому не можу перевірити. Вибачте. Будь ласка, хтось підтвердить це і прокоментує чи відредагує мою відповідь.
lesmana

4
в ubuntu 16.04 tmpreaper покинуто як незахищений, будь ласка, дивіться: fossies.org/linux/tmpreaper/debian/README.security
tamerlaha

1
Ні. В Ubuntu 16.04 її просто замінює системний механізм. Прочитайте цей документ, і те, що ви насправді знайдете, - це пояснення того, чому аналіз безпеки, який стверджує про невпевненість, є хибним.
JdeBP

141

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

Тут ви можете змінити час у наступному файлі:

/etc/default/rcS

TMPTIME говорить про те, наскільки часто може бути очищено tmp dir за дні


9
Очищення кожного завантаження не є ідеальним для машини, яка ніколи не перезавантажується, як сервер. У мене більше 500 000 файлів, що займають 5 Гб місця в моєму / tmp, тому що мій сервер має 378 днів роботи. Я не бажаю перезавантажувати його, просто тому, що очищення цих файлів при перезавантаженні потребує годин.
rjmunro

10
У вашому випадку вам слід дати tmpreaperшанс.
qbi

1
Завдання CRON може легко вирішити це.
Кен Шарп

Також tmpwatchповинен бути відповідний інструмент.
ArekBulski

1
Схоже, Ubuntu / systemd вже пропонує рішення. Я б сказав більше, але .... systemd.
Кен Шарп

65

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

Зміна /tmpчастоти очищення

Параметр за замовчуванням, який повідомляє вашій системі очистити /tmpпри перезавантаженні, зберігається у /etc/default/rcSфайлі. Значення, на яке ми подивимось, - це TMPTIME.

Поточне значення TMPTIME=0повідомляє видалити файли при перезавантаженні, незважаючи на вік файлу. Якщо змінити це значення на інше (додатне) число, це змінить кількість днів, у яких файл може пережити /tmp.

TMPTIME=7

Цей параметр дозволить файлам залишатись /tmpдо тижня, а потім видалити їх при наступному перезавантаженні. Від'ємне число ( TMPTIME=-1) вказує системі ніколи нічого не видаляти в /tmp. Це, мабуть, не те, що ви хочете, але є в наявності.


1
гарне пояснення. Але в якому сценарії є команда очищення? Я бачив /etc/init/mounted-temp.conf, але в ньому є така лінія, start on mounted MOUNTPOINT=/tmpяка змушує мене думати, що це не застосовується.
enzotib

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" на "-", якщо ви ніколи не хочете видаляти файли. Це я доклав усіх зусиль, щоб сторінка man майже не була непроникною з деталями.

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


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
Джо Гермуска

10

До 14.04:

Він очищається при кожному перезавантаженні.


З'являється з 14.04+, він використовує лише tmpreaper, а не сценарій "per boot" FWIW
rogerdpack

Мої системи 14.04 всі очищаються при перезавантаженні. Ніколи навіть не чув tmpreaper.
Кен Шарп

що робити, якщо ви ніколи не перезавантажуєте систему?
phuclv

7

В systemdUbuntu (15.10 і новіших) це робиться системою, використовуючи 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параметри конфігурації системи (див. man 5 systemd.timer).


Я змінив таймер на 20 хв, і я бачу, що команда стану показує, що він фактично використовує конфігурацію 20 хв. але моя проблема полягає в тому, що /tmpдосі не очищені. і мені це потрібно, щоб прибрати. навіть ручний старт sudo systemctl start systemd-tmpfiles-cleanне робить цього. Будь-які ідеї чому?
користувач2932688

5

На одному з наших серверів під управлінням 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/...
Даніель Алдер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.