Я использую оперативную память для моих tmpfs / tmp, 2 ГБ, если быть точным. Обычно этого достаточно, но иногда процессы создают файлы там и не могут очистить после себя. Это может произойти, если они потерпят крах. Мне нужно удалить эти потерянные tmp файлы, иначе в будущем / tmp не хватит места.
Как я могу безопасно собрать мусор / TMP? Некоторые люди делают это, проверяя отметку времени последнего изменения, но этот подход небезопасен, поскольку могут существовать длительные процессы, которым все еще нужны эти файлы. Более безопасный подход - объединить условие отметки времени последней модификации с условием, что ни у одного процесса нет дескриптора файла для файла. Есть ли программа / скрипт / и т.д., которые воплощают этот подход или какой-то другой подход, который также безопасен?
Кстати, разрешает ли Linux / Unix режим открытия файла с созданием, при котором созданный файл удаляется при завершении процесса создания, даже если это происходит из-за сбоя?
источник
Ответы:
Вы можете попробовать что-то вроде этого:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find используется для поиска файлов, которые соответствуют определенным критериям.
-mtime +7
выбираются только файлы старше 7 дней (вы можете использовать любое другое значение)-exec fuser -s {} ';'
вызывает fuser в режиме без вывода сообщений для каждого файла, который соответствует критериям устаревания. fuser возвращает 0 (= true) для каждого файла, к которому был получен доступ, и 1 (= false) для недоступных. Поскольку нас интересуют только недоступные, мы ставим-not
перед этим-exec
-exec echo {} ';'
просто печатает все имена файлов, соответствующие критериям. вы можете использовать-exec rm {} ';'
вместо этого здесь, но так как это может удалить некоторые все еще используемые файлы, я думаю, что безопаснее сначала сделать простое эхо.-name 'foo*.bar'
или-uid 123
ограничить эффекты очистки конкретными шаблонами файлов или идентификаторами пользователей, чтобы избежать случайных эффектов.К последнему пункту: Учтите, что могут быть файлы, которые записываются только один раз (например, при загрузке системы), но часто читаются (например, любой файл X-session-cookie). Поэтому я рекомендую добавить некоторые проверки имен, чтобы они влияли только на файлы, созданные неисправными программами.
edit2: К вашему последнему вопросу: файл не будет удален с диска, пока ни у одного процесса не будет открытого дескриптора (по крайней мере, для родных файловых систем linux). Проблема заключается в том, что запись в каталоге удаляется немедленно, а это означает, что с момента удаления файла новые процессы не смогут открыть файл (так как к нему не прикреплено имя файла).
Подробности см .: /programming/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux
edit3: Но что, если я хотел бы автоматизировать весь процесс?
Как я уже сказал, могут быть файлы, которые записываются один раз, а затем читаются время от времени (например, файлы cookie сеанса X, файлы PID и т. Д.). Они не будут исключены этим небольшим скриптом удаления (по этой причине вы можете сначала выполнить тестовый прогон,
echo
прежде чем удалять файлы).Одним из способов реализации безопасного решения является использование
atime
.atime
хранит время последнего доступа к каждому файлу. Но эта опция файловой системы часто отключена, потому что она имеет некоторое влияние на производительность (согласно этому блогу где-то в 20-30% регионе). Естьrelatime
, но тот пишет время доступа только еслиmtime
изменилось, так что этот нам не поможет.Если вы хотите использовать
atime
, я бы порекомендовал размещать их/tmp
на отдельном разделе (в идеале, на виртуальном диске), чтобы влияние на производительность системы не было слишком значительным.После
atime
включения все, что вам нужно сделать, это заменить-mtime
параметр в приведенной выше командной строке на-atime
.Возможно, вы сможете удалить
-not -exec fuser -s {} ';'
, но я бы оставил его там просто для уверенности (на случай, если приложения будут держать файлы открытыми в течение длительного периода времени).Но имейте в виду, что нужно протестировать команду
echo
перед тем, как вы удалите все, что нужно вашей системе!источник
/tmp/
очистки)./tmp
находитесь на отдельном разделе (например, на виртуальном диске), вы можете включитьatime
его и использовать-atime
параметрfind
.Не катай свои собственные.
У Debian / Ubuntu есть tmpreaper, он, вероятно, доступен и на других дисках.
источник
/etc/tmpreaper.conf
файле, если я установлю оба/tmp
и/var/tmp
как каталоги очистки, долго ли вы можете порекомендоватьTMPREAPER_TIME
параметр или максимальную давность файлов tmp, которые нужно удалить? Я слышал, лучше хранить/var/tmp
файлы дольше , чем/tmp
файлы. Но если они могут быть установлены только с одинаковым максимальным возрастом, я понятия не имею.По поводу последней части вашего вопроса:
Хотя я не думаю, что существует режим открытия / создания «delete-this-if-I-die», процесс может безопасно удалить файл непосредственно после его создания, если он сохраняет дескриптор указанного файла открытым. Затем ядро сохранит файл на диске, и как только последний процесс, открывший файл, выйдет (будь то аварийно или нормально), пространство, занимаемое файлом, будет освобождено.
Для общего решения проблемы, заключающейся в том, что некоторые процессы иногда не очищают / tmp, я бы посоветовал взглянуть на пространства имен монтирования, описанные, например, здесь или здесь . Если рассматриваемый процесс является системным демоном, systemd и его нативная функция, позволяющая использовать частные / tmp файловые системы, могут представлять интерес.
источник
для GUI попробуйте это; http://bleachbit.sourceforge.net/
очищает и скрабы. режим предварительного просмотра.
источник
Получите список файлов старше, чем это так, исключите файлы, которые открыты чем-либо из этого списка:
lsof -n +D /tmp
: искать открытые файлы в / tmpawk 'NR>1 {print $9}'
: печатать только девятый столбец вывода lsof, исключая заголовкиtr \\n \|
: заменять новую строку на строку (ИЛИ в egrep)egrep -v "foo|moo|bar"
: печатать строки, НЕ содержащие foo или moo или barисточник
Я согласен с вышесказанным, чтобы добавить к нему, хотя - я всегда запускаю
lsof +L1 | grep tmp
и либо убиваю, либо перезапускаю процессы, удерживающие «удаленные» файлы tmp: ПРИМЕР -источник
Вы могли бы просто сделать
rm -rf /tmp/*
и надеяться, что ничего не сломается ...источник