- How to cleanup tmp folder safely on Linux
- 8 Answers 8
- edit3: But what if I wanted to automate the whole process?
- Чистим и увеличиваем папку /tmp в Cpanel
- Как увеличить размер папки /tmp
- Чистим папку /tmp
- Чистим папку /tmp с помощью утилиты tmpwatch
- How to clean /tmp?
- UPDATE
- Как очистить временную папку Linux, когда она заполняется
- Метод 1 — Найти команду
- Способ 2 — пустой каталог с помощью rm
- Проверьте, когда временная папка Linux заполнена
- Df
- Du
- Дерево
How to cleanup tmp folder safely on Linux
I use RAM for my tmpfs /tmp, 2GB, to be exact. Normally, this is enough but sometimes, processes create files in there and fail to cleanup after themselves. This can happen if they crash. I need to delete these orphaned tmp files or else future process will run out of space on /tmp. How can I safely garbage collect /tmp? Some people do it by checking last modification timestamp, but this approach is unsafe because there can be long-running processes that still need those files. A safer approach is to combine the last modification timestamp condition with the condition that no process has a file handle for the file. Is there a program/script/etc that embodies this approach or some other approach that is also safe? Incidentally, does Linux/Unix allow a mode of file opening with creation wherein the created file is deleted when the creating process terminates, even if it’s from a crash?
8 Answers 8
You might want to try something like that:
find /tmp -mtime +7 -and -not -exec fuser -s <> ‘;’ -and -exec echo <> ‘;’
find is used to find files that match certain criteria.
- -mtime +7 only selects files that are older than 7 days (you may use any other value)
- -exec fuser -s <> ‘;’ calls fuser in silent mode for every file that matches the oldness criteria. fuser returns 0 (=true) for every file that’s been accessed right now and 1 (= false) for the unaccessed ones. As we are only interested in the unaccessed ones, we put a -not in front of this -exec
- -exec echo <> ‘;’ just prints all file names matching the criteria. you might want use -exec rm <> ‘;’ instead here, but as this may delete some still-in-use files, I think it’s safer to do a simple echo first.
- edit: You might want to add something like -name ‘foo*.bar’ or -uid 123 to limit the effects of the cleanup to specific file patterns or user IDs to avoid accidental effects.
To the last point: Consider that there might be files that are only written once (e.g. at system boot) but read frequently (e.g. any X-session-cookie). Therefore I recommend adding some name checks to only affect files created by your faulty programs.
edit2: To your last question: A file won’t get deleted from disk until no process has an open handle to it (at least for native linux filesystems). The problem is that the directory entry is removed immediately which means that from the time you remove the file no new processes can open the file anymore (as there’s no filename attached to it).
edit3: But what if I wanted to automate the whole process?
As I said, there might be files that are written once and then read every once in a while (e.g. X session cookies, PID files, etc.). Those won’t be excluded by this little removal script (which is the reason why you might wanna do a test run with echo first before actually deleting files).
One way to implement a safe solution is to use atime .
atime stores the time each file was last accessed. But that file system option often is disabled because it has quite some performance impact (according to this blog somewhere in the 20-30% region). There’s relatime , but that one only writes the access time if mtime has changed, so this one won’t help us.
If you want to use atime , I’d recommend to have /tmp on a separate partition (ideally a ramdisk) so that the performance impact on the whole system isn’t too big.
Once atime is enabled, all you have to do is to replace the -mtime parameter in the above command line with -atime .
You might be able to remove the -not -exec fuser -s <> ‘;’ , but I’d keep it there just to be sure (in case applications keep files open for a long period of time).
But keep in mind to test the command using echo before you end up removing stuff your system still needs!
Чистим и увеличиваем папку /tmp в Cpanel
Проблема началась неожиданно. На административный email в Сpanel стали приходить email оповещения, про то, что место на диске кончается:
DISKWARN: /tmp on vps*** (ip): 0.41/0.47 GB — 92%
The file system /usr/tmpDSK, which is mounted at /tmp, has reached warn status because it is 92% full.
Это означает, что временная папка моего Centos совсем забилась. Вы конечно можете её немного почистить, но это не обезопасит Вас от тех же проблем через пару недель, а может и дней. Я рекомендую расширить диск с tmp до 2 Гб.
Как увеличить размер папки /tmp
Рассмотрим, как можно увеличить размер диска /tmp. Для выполнения всех команд, Вам понадобится подключиться к серверу через SSH клиент, к примеру Putty. После начинаем вводить следующий набор команд:
1) Останавливаем cpanel, apache и mysql:
/etc/init.d/cpanel stop
/etc/init.d/httpd stop
/etc/init.d/lsws stop
/etc/init.d/mysql stop
2) Демонтируем папку /tmp and /var/tmp:
umount -l /tmp
umount -l /var/tmp
3) Копируем папку /usr/tmpDSK в другое место (на всякий случай, чтобы Вы не потеряли нужные данные):
mv /usr/tmpDSK /usr/tmpDSK_back
4) Изменяем системный скрипт /scripts/securetmp в котором установим tmpdsksize до нужного размера:
vi /scripts/securetmp
Откроется редактор файлов. Прокрутите его стрелками вниз до нужного места и установите значение до нужного:
$tmpdsksize = 2048000
Сохранитесь, для этого нажмите ESC и введите команду ZZ
5) Выполните этот скрипт:
/scripts/securetmp
6) Запустите все остановленные сервисы: cpanel, apache и mysql:
/etc/init.d/cpanel start
/etc/init.d/httpd start
/etc/init.d/lsws start
/etc/init.d/mysql start
Готово! Теперь наш диск объемом 2 Гб и не будет нас тревожить.
Чистим папку /tmp
Удалять всё из этой папки категорически нельзя, это может нарушить работу сервера и привести к ошибками. Но есть ряд файлов, которые удалять можно.
Для начала, выясните что забивает место в папке, для этого выполните команды:
cd /tmp
К примеру, там есть много файлов с мусором, похожих на этот:
sess_fesdasdasajf2131231241133512412
Чтобы очистить от них папку за раз, можно выполнить команду
rm -f -r ses*
Чистим папку /tmp с помощью утилиты tmpwatch
Также можно прибегнуть к программе tmpwatch, которая создана для удаления ненужных и устаревших файлов, к которым сервер не обращался долгое время.
Нижеприведенная команда будет удалять в папке /tmp файлы, к которым не обращались более 2 недель (24х14 дней = 336)
tmpwatch —mtime —all 336 /tmp
Если у Вас не работает данная команда, значит надо установить tmpwatch. Это легко сделать одной командой:
yum install tmpwatch
Надеюсь моя инструкция помогла Вам и проблема решена. Если нет — обращайтесь в комментарии и разберемся с проблемой вместе!
How to clean /tmp?
will delete all files and folders older than 10 days. you may want to add it to the daily cron.
UPDATE
In comments below @sfussenegger recommends a slightly different format of this command that may be better suited to your needs and to the system you’re operating on.
sudo find /tmp -type f -atime +10 -delete
Here the command is using sudo to make sure everything is deleted (or you could run it as root), operating on files that haven’t been accessed for more than 10 days and only deletes files, not folders. It also uses -delete to avoid having to execute rm command
instead of creation time (-ctime) you may want to use access time (-atime) instead — of course only if the filesystem keeps this information (check for noatime in /etc/fstab)
ok, please bear with me but there’s one more thing: you want to search files only ( -type f ). otherwise you may find that the parent of a directory tree hasn’t been accessed in a while and delete all its content that could potentially still be in use. so the final command I’d recommend is sudo find /tmp -type f -atime +10 -delete
@sfussenegger, perhaps your could promote your comments to an answer? I think it is better than being «hidden» in the comments.
You can assume that anything inside a tmp directory (/tmp/ /usr/tmp etc) can be deleted. BEFORE you start deleting stop all programs and services you are using since /tmp/ can be used by programs to temporarily store information for that session. So do a sudo service mysql stop and sudo service apache2 stop if you have a mysql and/or apache running. The name of the files in the /tmp/ directory most times give a clue to what program they belong.
will empty the /tmp/ directory and remove all files and subdirectories. Be careful to type it correctly. The command pwd in there is not necessary but should show /tmp .
If you want it interactively (so you need to confirm deleting):
Also worth noting that a reboot will clear /tmp aswell as shown here: How is the /tmp directory cleaned up? So if /tmp/ is full of files after a reboot you need to investigate where those files originate from.
Как очистить временную папку Linux, когда она заполняется
Временная папка в системе Linux имеет ограниченный объем места. Обычно размер временной папки не является проблемой, так как он очищается при каждой перезагрузке. Однако, если вы используете систему Linux, которая не перезагружается часто, папка может заполниться и вызвать огромные проблемы.
Метод 1 — Найти команду
Команда find, встроенная во все дистрибутивы Linux, — это не просто надежное приложение командной строки для Linux, которое может быстро находить файлы и папки. Его также можно использовать для быстрого удаления большого количества файлов из любого каталога, включая тот, в котором хранятся временные данные.
Чтобы использовать команду find для очистки временной папки Linux, начните с открытия окна терминала, нажав Ctrl + Alt + T или Ctrl + Shift + T на клавиатуре. Затем, когда окно командной строки будет готово к использованию, переключитесь со стандартного пользователя на учетную запись root с помощью команды su или sudo -s.
Теперь, когда вы получили root-доступ в терминале, используйте приведенную ниже команду find в сочетании с переключателем «-delete», чтобы очистить все файлы из временного каталога.
Выполнив указанную выше команду, временный каталог будет пуст от всех файлов. Однако папки остаются. Если вы предпочитаете удалить абсолютно все, попробуйте эту команду find.
Способ 2 — пустой каталог с помощью rm
Удалять все из временного каталога лучше всего с помощью метода 1, так как он позволяет избежать использования команды rm целиком. Тем не менее, если вам не повезло с методом 1, этот путь — единственный другой вариант.
Первый шаг в очистке временного каталога с помощью команды rm — открыть окно терминала. Вы можете сделать это, нажав Ctrl + Alt + T или Ctrl + Alt + Shift + T на клавиатуре. После открытия окна командной строки получите root-доступ.
Переключив командную строку на root-доступ, перейдите в «/ tmp» с помощью команды CD.
Внутри временного каталога в вашей системе Linux запустите команду ls, чтобы просмотреть содержимое папки.
Затем запустите команду rm с переключателем «-rf» и символом подстановки *. Используя подстановочный знак с командой rm, командная строка Linux удалит все файлы и папки сразу. Это сэкономит время и избавит от необходимости многократно писать команду rm для каждой папки и файла во временном каталоге.
Отсюда снова запустите команду ls, чтобы увидеть содержимое временного каталога. Если команда rm прошла успешно, ничего не появится. Если в каталоге все еще есть данные, повторно запустите указанную выше команду и попробуйте еще раз.
Проверьте, когда временная папка Linux заполнена
Временный каталог — важное место в Linux. Многие программы и службы используют его для хранения временных данных. Иногда избыток данных может быстро заполнить папку.
Чтобы предотвратить заполнение временного каталога в будущем, чтобы не прибегать к его очистке вручную, вот несколько быстрых способов проверить текущее использование данных в папке.
Df
Команда Df отлично подходит для проверки размера временного каталога в Linux, поскольку это встроенный инструмент командной строки, который поставляется со всеми операционными системами Linux.
Откройте окно терминала, нажав Ctrl + Alt + T или Ctrl + Shift + T на клавиатуре. Затем, когда окно командной строки открыто и готово к работе, укажите команду du во временном каталоге, чтобы увидеть, сколько данных оно использует в блоках.
Не нравится считывание блоков? Рассмотрите возможность комбинирования команды df с переключателем командной строки «h». Он заменит блочное считывание на обычные мегабайты и гигабайты, что намного легче понять.
Du
Команда df отлично показывает подробное считывание временного каталога. Однако, если вы просто ищете краткое изложение того, сколько места занимает папка, лучше использовать команду du, так как она показывает только, какая часть временного каталога занята (в мегабайтах) и не более того.
Дерево
Нужен подробный отчет о том, сколько именно файлов и папок находится во временном каталоге? Попробуйте команду tree.
Примечание: дерево может быть уже установлено в вашей системе Linux. Если это не так, перейдите на сайт Pkgs.org и узнайте, как его установить.
Приведенная выше команда покажет небольшое количество файлов и папок, которые в настоящее время используют временный каталог. Однако он не покажет их размер. Если вы хотите узнать, сколько данных находится во всех файлах и папках, попробуйте команду tree с «du».