При работе с архивами — سواء это ручная распаковка, автоматическая обработка в скриптах или анализ содержимого антивирусами и DLP-системами — на диске остаются временные файлы. Если их не удалять, диск заполняется мусором; если удалять неаккуратно, можно сломать запущенные процессы или потерять данные, которые ещё не записаны в итоговое хранилище. В этой статье разбираем, где именно появляются такие файлы, как их идентифицировать, какие методы удаления безопасны в разных сценариях и как организовать контроль, чтобы очистка не стала причиной инцидента.
- Откуда берутся временные файлы при работе с архивами
- Риски неправильной очистки
- Как идентифицировать файлы, безопасные для удаления
- 1. Принадлежность к процессу
- 2. Возраст и признаки «брошенности»
- 3. Наличие результата в целевом хранилище
- Ручные методы очистки
- Windows: встроенные средства
- Linux: командная строка и системные таймеры
- Автоматизация в скриптах и конвейерах (CI/CD, ETL, бэкапы)
- Принцип «чистим за собой сразу»
- Изоляция рабочих директорий
- Очистка при аварийном завершении контейнера/пода
- Специфические сценарии и нюансы
- Антивирусные сканеры и DLP
- Архиваторы с GUI (WinRAR, 7-Zip, PeaZip)
- Многотомные архивы и восстановление
- Зашифрованные архивы и пароли
- Сравнение подходов к очистке
- Типичные ошибки и как их избежать
- Чек-лист перед массовой очисткой на проде
- Сценарии: как действовать в типичных ситуациях
- Мониторинг и предупреждение
- Практический следующий шаг
- FAQ
Откуда берутся временные файлы при работе с архивами
Понимание механизма создания временных файлов — первый шаг к безопасной очистке. Архиваторы, сканеры и конвейеры обработки данных используют временное хранилище по разным причинам:
- Распаковка для чтения: большинство архиваторов (7-Zip, tar, gzip, unrar) при чтении содержимого без полной распаковки («просмотр», «тест целостности», извлечение отдельных файлов) создают временные копии в системной папке %TEMP% (Windows) или /tmp (Linux/Unix).
- Потоковая обработка: антивирусы, DLP, парсеры логов и конвертеры часто распаковывают архив целиком во временную директорию, сканируют файлы, а потом удаляют папку. Если процесс обрушился или был убит — папка остаётся.
- Многотомные и сплит-архивы: при сборке частей в единый поток создаются промежуточные буферы.
- Защищённые архивы: при вводе пароля некоторые утилиты расшифровывают содержимое во временную область перед выдачей пользователю.
- Конвертация и репакинг: перевод из формата в формат (например, .tar.gz → .zip) часто проходит через промежуточную распаковку.
Ключевой момент: временные файлы могут находиться не только в системном TEMP. Многие утилиты позволяют задать свою рабочую директорию через переменные окружения (TMPDIR, TEMP, TMP), параметры командной строки (-w, —workdir) или конфигурационные файлы. В корпоративных средах часто встречаются выделенные тома для временных данных — быстрые NVMe, RAM-диски или отдельные разделы с квотами.
Риски неправильной очистки
Удаление «всего, что выглядит как временное» — частая причина инцидентов. Основные сценариев проблем:
- Удаление активных файлов: процесс всё ещё держит дескриптор открытым. В Windows файл нельзя удалить, пока он открыт (получаете «Access denied»), но запись в него продолжается. В Linux файл удаляется из каталога, но место на диске не освобождается до закрытия дескриптора — df показывает занятое пространство, du — нет. Результат: «пропавшее» место, которое вернётся только после рестарта процесса или перезагрузки.
- Разрыв цепочки обработки: конвейер из нескольких этапов (распаковка → сканирование → упаковка → передача) ожидает, что временная директория сохранится до конца. Удаление на полпути ломает последующие шаги.
- Потеря уникальных данных: если архив пришёл извне, был изменен пользователем или скриптом и существует только в распакованном виде во временной папке — удаление означает необратимую потерю.
- Нарушение аудита и расследований: временные файлы могут быть единственным местом, где лежал «сырой» объект до обработки. Их преждевременное удаление мешает форензике и compliance-проверкам.
- Самоподписанные исполняемые файлы: некоторые вредоносы и легитимные установщики распаковывают себя во временную папку и запускаются оттуда. Удаление во время выполнения вызовет краш; удаление после — помешает повторному запуску без перескачивания.
Как идентифицировать файлы, безопасные для удаления
Перед удалением нужно ответить на три вопроса: чей это файл, жив ли процесс-владелец, и есть ли копия результата где-то ещё.
1. Принадлежность к процессу
Используйте инструменты ОС для определения, какой процесс держит файл:
- Windows: Resource Monitor (resmon.exe → вкладка CPU → Associated Handles), Process Explorer (Find → Handle or DLL), PowerShell: Get-Process | Where-Object {$_.Id -eq (Get-FileItem -Path ‘C:\Temp\xxx’).OwnerProcessId} (упрощённо).
- Linux: lsof /путь/к/файлу или fuser -v /путь/к/файлу. Для целой директории: lsof +D /tmp/workdir.
Если файл открыт — не удаляйте. Дождитесь завершения процесса или корректно остановите его.
2. Возраст и признаки «брошенности»
Файлы, которые не менялись длительное время и не открыты ни одним процессом, — основные кандидаты на удаление. Типичные маркеры:
- Время последнего доступа/модификации (atime/mtime) старше N дней (часто 1–7 дней для горячего временного хранилища, 30 дней для холодного).
- Имена по шаблонам: tmp*, ~*, *.tmp, *.temp, 7z*, rar*, _MEI* (PyInstaller), _MEI* (cx_Freeze), hsperfdata_* (Java), scoped_dir* (Chrome/Edge).
- Пустые директории, оставшиеся после удаления содержимого.
Важно: возраст один не гарантирует безопасность. Долгоживущие сервисы (бэкапы, индексаторы, CI-агенты) могут держать рабочие папки неделями. Всегда проверяйте lsof/handles.
3. Наличие результата в целевом хранилище
Если архив был обработан конвейером, убедитесь, что итоговые файлы успешно записаны в назначение (файловое хранилище, БД, объектное хранилище, почтовый ящик). Проверьте:
- Коды возврата последних шагов конвейера (exit code 0).
- Логи завершения: «successfully extracted», «upload complete», «import done».
- Контрольные суммы/размеры: совпадают ли исходный и итоговый объём.
Только после подтверждения успешного завершения можно удалять исходные временные данные.
Ручные методы очистки
Подходят для разовых операций, администрирования рабочих станций и серверов в интерактивном режиме.
Windows: встроенные средства
- Очистка диска (cleanmgr.exe): безопасен, но консервативен — удаляет только файлы старше 7 дней из системных TEMP и корзины. Не трогает пользовательские рабочие папки.
- Storage Sense (Windows 10/11): настраиваемая автоматика: удаление файлов из Downloads и Recycle Bin по возрасту, очистка TEMP при нехватке места. Включается в Settings → System → Storage.
- Ручное удаление через Explorer: зайдите в %TEMP% (Win+R → %TEMP%), сортируйте по дате изменения, выделяйте старые папки с понятными именами (7zO1234.tmp, Rar$EX00.123), удаляйте. Если файл занят — система не даст удалить.
- PowerShell для точечной очистки:
# Пример: удалить файлы старше 3 дней в системном TEMP, не открытые процессами
$cutoff = (Get-Date).AddDays(-3)
Get-ChildItem -Path $env:TEMP -File | Where-Object { $_.LastWriteTime -lt $cutoff } | ForEach-Object {
try { Remove-Item $_ -Force -ErrorAction Stop; Write-Host «Deleted: $($_.FullName)» }
catch { Write-Warning «Locked or error: $($_.FullName) — $($_.Exception.Message)» }
}
Linux: командная строка и системные таймеры
- systemd-tmpfiles: основной механизм в современных дистрибутивах. Конфигурация в /usr/lib/tmpfiles.d/ (пакеты) и /etc/tmpfiles.d/ (админ). Пример правила для своей рабочей директории архиватора:
# /etc/tmpfiles.d/my-archiver.conf
d /var/tmp/archiver-work 0755 appuser appgroup 1d —
# d = создавать директорию если нет, удалять файлы старше 1 дня, не удалять саму директориюЗапуск: systemd-tmpfiles —clean (обычно по таймеру systemd-tmpfiles-clean.timer раз в сутки).
- find + xargs (осторожно):
# Удалить файлы старше 2 дней в /tmp/archiver-*, не открытые процессами
find /tmp -maxdepth 2 -type f -name ‘archiver-*’ -mtime +2 -print0 | xargs -0r fuser -s 2>/dev/null || xargs -0r rm -f
# Лучше: использовать lsof для фильтрации открытых
find /tmp/archiver-work -type f -mtime +1 -exec sh -c ‘lsof «$1» >/dev/null || rm -f «$1″‘ _ {} \; - tmpreaper (Debian/Ubuntu) / tmpwatch (RHEL/CentOS): специализированные утилиты с защитой от удаления открытых файлов и белыми списками. Пример /etc/tmpreaper.conf:
SHOWWARNING=true
DIRS=»/tmp/archiver-work /var/tmp/archiver-work»
MAXAGE=2d
PROTECT_PATTERNS=»*.lock *.pid»
Автоматизация в скриптах и конвейерах (CI/CD, ETL, бэкапы)
В автоматизированных пайплайнах очистка должна быть детерминированной частью процесса, а не отдельной задачей «по расписанию».
Принцип «чистим за собой сразу»
Каждый шаг, создающий временные данные, отвечает за их удаление при успехе и при ошибке. Паттерны:
- Python (tempfile.TemporaryDirectory):
import tempfile, shutil, subprocess, oswith tempfile.TemporaryDirectory(prefix=’archiver-‘, dir=’/var/tmp’) as tmpdir:
archive_path = ‘/incoming/data.zip’
# Распаковка
subprocess.run([‘7z’, ‘x’, archive_path, f’-o{tmpdir}’], check=True)
# Обработка файлов из tmpdir
process_extracted(tmpdir)
# Успех — TemporaryDirectory удалится автоматически при выходе из with
# При исключении — тоже удалится - Bash (trap):
WORKDIR=$(mktemp -d -t archiver-XXXXXX -p /var/tmp)
trap ‘rm -rf «$WORKDIR»‘ EXIT INT TERM7z x «$ARCHIVE» -o»$WORKDIR»
process_extracted «$WORKDIR»
# При любом выходе (успех, ошибка, Ctrl+C) сработает trap - PowerShell (try/finally):
$workDir = New-Item -ItemType Directory -Path «$env:TEMP\archiver-$(Get-Random)» -Force
try {
& 7z x $archivePath -o$workDir.FullName
Process-Extracted $workDir.FullName
}
finally {
if (Test-Path $workDir.FullName) { Remove-Item $workDir.FullName -Recurse -Force -ErrorAction SilentlyContinue }
}
Изоляция рабочих директорий
Никогда не используйте общий /tmp или %TEMP% без подпапки с уникальным именем для параллельных запусков. Используйте mktemp -d, tempfile.mkdtemp(), [IO.Path]::GetRandomFileName(). Это исключает коллизии и позволяет безопасно чистить только свою директорию.
Очистка при аварийном завершении контейнера/пода
В Kubernetes/Docker временные файлы внутри контейнера исчезают при удалении пода (ephemeral storage). Если используете emptyDir или hostPath — настройте preStop hook или sidecar для чистки. Для node-local ephemeral storage полагайтесь на kubelet (—image-gc-high-threshold, —image-gc-low-threshold).
Специфические сценарии и нюансы
Антивирусные сканеры и DLP
Эти системы часто имеют свои настройки временного хранилища. Примеры:
- Kaspersky / ESET / Defender: настраивают «Временную папку для распаковки» в политике. Очистка происходит автоматически после сканирования, но при краше сканера могут оставаться папки вида KAV*, ESET*, MpCmdRun*. Безопасно удалять только если служба остановлена или файл не открыт.
- ICAP-серверы (squid + c-icap + clamav): используют /var/spool/c-icap/ или заданную в clamd.conf TemporaryDirectory. Чистятся по таймауту или при рестарте сервиса.
Архиваторы с GUI (WinRAR, 7-Zip, PeaZip)
При «Открыть архив» → «Просмотр» → двойной клик на файл внутри — файл извлекается во временную папку и ассоциированная программа открывает его. При закрытии программы-просмотрщика архиватор ждёт некоторое время и удаляет временный файл. Если пользователь закрыл архиватор, а просмотрщик открыт — файл остаётся. Правило: закрывайте архиватор после закрытия всех просмотрщиков.
Многотомные архивы и восстановление
При проверке целостности (7z t, rar t) временные файлы обычно не создаются — чтение потоковое. При восстановлении (rar r, par2) создаются рабочие файлы в той же папке, где лежат тома. Не удаляйте .rev, .par2, .vol* — это не мусор, а данные для восстановления.
Зашифрованные архивы и пароли
При вводе пароля в GUI-архиваторе расшифрованное содержимое может временно лежать в открытом виде в TEMP. На многопользовательских системах это риск утечки. Митигация: задать личную временную папку на зашифрованном томе (TMPDIR=/home/user/private_tmp) или использовать консольные утилиты с.pipe-вводом пароля (7z x -p’password’ archive.7z -so > file — без временных файлов).
Сравнение подходов к очистке
| Подход | Где применим | Плюсы | Минусы / Риски | Уровень автоматизации |
|---|---|---|---|---|
| Встроенные ОС (cleanmgr, Storage Sense, systemd-tmpfiles) | Рабочие станции, серверы общего назначения | Никакой настройки, безопасны, учитывают блокировки | Не знают про кастомные рабочие директории, консервативные сроки | Полная автоматизация |
| Специализированные утилиты (tmpreaper, tmpwatch) | Серверы с предсказуемыми рабочими папками | Гибкие правила, защита открытых файлов, белые списки | Требуют настройки под каждую папку, не кроссплатформенны | Автоматизация по расписанию |
| Встроенная в код (tempfile, trap, try/finally) | Скрипты, CI/CD, ETL, бэкапы, сервисы | Гарантированная чистка именно своих данных, атомарность | Требует дисциплины разработчиков, не покрывает «чужой» мусор | Полная автоматизация в пайплайне |
| Ручная / ад-хок (Explorer, find + rm) | Разовые расследования, забитые диски, форензика | Полный контроль, можно проинспектировать перед удалением | Человеческий фактор, не масштабируется, риск ошибки | Ручная |
Типичные ошибки и как их избежать
- Удаление по маске rm -rf /tmp/*: убивает сокеты сервисов (systemd, docker, X11, базы данных), ломает текущие сессии. Всегда ограничивайте глубину (-maxdepth), имя (-name ‘mypref-*’) и проверяйте lsof.
- Очистка /var/tmp по тем же правилам, что /tmp: по стандарту FHS /var/tmp сохраняется между перезагрузками, там лежат данные, которые должны пережить ребут. Сроки хранения там — недели, а не дни.
- Игнорирование квот и inode: даже если места в байтах много, кончившиеся inode (много мелких файлов) вешают ФС. Мониторьте df -i.
- Удаление папки, которая является точкой монтирования: rm -rf /mnt/tmpwork/* когда том не смонтирован — удалит данные на родительской ФС. Всегда проверяйте mountpoint /mnt/tmpwork или используйте umount перед чисткой.
- Настройка TMPDIR на сетевую шару: лагги, блокировки, потеря данных при разрыве связи. Временная папка должна быть локальной, быстрой и с POSIX-блокировками.
Чек-лист перед массовой очисткой на проде
- Соберите список целевых директорий (системные + кастомные из конфигов приложений).
- Проверьте, какие процессы пишут туда сейчас (lsof +D /path / Resource Monitor).
- Остановите или переведите в maintenance окно сервисы-писатели, если возможно.
- Запустите dry-run: find /target -type f -mtime +N -print (или tmpreaper —test). Оцените объём и список.
- Убедитесь, что в списке нет файлов текущих запусков (по PID, по времени запуска сервиса).
- Выполните удаление с логированием: tmpreaper —verbose или скрипт с tee -a /var/log/tmpclean.log.
- Проверьте освободившееся место: df -h /target, df -i /target.
- Перезапустите остановленные сервисы, убедитесь в их здоровье.
Сценарии: как действовать в типичных ситуациях
- Диск забит на 95%, виноват /tmp: 1) lsof +D /tmp | awk ‘{print $2}’ | sort -u — найдите PID. 2) Посмотрите, чьи это процессы (ps -fp PID). 3) Если это ваши джобы — дождитесь завершения или аккуратно остановите. 4) Если это чужой сервис — не трогайте, расширьте диск или перенесите его TMPDIR. 5) Удалите только заведомо старые (-mtime +1) и неоткрытые файлы.
- CI-пайплайн падает с «No space left on device» на этапе распаковки: добавьте шаг очистки в начале джобы (rm -rf $WORKDIR), используйте уникальный WORKDIR на каждый запуск, настройте раннеру tmpfs для /tmp если позволяет память.
- Нужно сохранить доказательства для инцидента: не чистите ничего. Сделайте образ диска (dd, FTK Imager) или скопируйте подозрительную временную папку в evidence-хранилище с сохранением метаданных (cp -a /tmp/suspicious /evidence/case123/).
- Пользователь жалуется, что «пропали файлы из архива»: проверьте %TEMP% / /tmp на наличие папок архиватора за сегодня. Часто файл открыт в Excel/Word из архива, пользователь сохранил в тот же временный файл, а потом закрыл программу — архиватор удалил временную папку. Восстановить можно из теневых копий (VSS) или бэкапа.
Мониторинг и предупреждение
Не ждите забитого диска. Настройте алерты:
- Node Exporter + Prometheus + Grafana: метрики node_filesystem_avail_bytes, node_filesystem_files_free для точек монтирования /tmp, /var/tmp, кастомных рабочих томов. Пороги: <15% свободного места или <10% свободных inode → warning; <5% → critical.
- Zabbix / Datadog / New Relic: аналогичные триггеры по vfs.fs.size[/tmp,pfree] и vfs.fs.inode[/tmp,pfree].
- Логирование объёма временных данных: в скриптах добавьте du -sh $WORKDIR перед удалением, пишите в структурированный лог (JSON). Позволяет увидеть тренды и аномалии (внезапно 50 Гб вместо 200 Мб).
Практический следующий шаг
Начните с аудита: пройдитесь по серверам и рабочим станциям, где обрабатываются архивы, и составьте карту — где именно создаются временные файлы (системный TEMP, кастомные папки, контейнеры). Для каждой точки решите: кто отвечает за очистку (ОС, утилита, сам код), какой срок хранения уместен, и настроен ли мониторинг заполненности. Внедрите правило «каждый создатель — свой чистильщик» в новых скриптах и пайплайнах. Для легаси — настройте tmpreaper / systemd-tmpfiles с консервативными сроками (3–7 дней) и белыми списками активных сервисов. Регулярно проверяйте логи очистки на предмет ошибок «permission denied» или «file in use» — они указывают на процессы, которые не отпускают временные данные вовремя.
FAQ
Можно ли просто отключить создание временных файлов у архиватора?
Полностью — редко. Консольные утилиты (7z, tar, gzip) при потоковом чтении (-so, stdout) могут работать без временных файлов, но при случайном доступе к файлам внутри архива (список, тест, извлечение одного файла из середины) временная распаковка неизбежна. GUI-архиваторы всегда используют временную папку для «Открыть файл из архива».
Безопасно ли удалять папки _MEIxxxxxx в /tmp или %TEMP%?
Это временные директории PyInstaller / cx_Freeze для запуска собранных Python-приложений. Удалять можно только если ни один процесс не использует их (проверьте lsof). Если приложение запущено — удаление приведёт к крашу. После завершения приложения папка должна удалиться сама; если осталась — безопасно чистить по возрасту (>1 дня).
Как очистить временные файлы на удалённом сервере, если нет доступа к консоли?
Через систему управления конфигурацией (Ansible, Salt, Chef) или агент мониторинга с возможностью выполнения команд. Пример Ansible-таска: — name: Clean old archiver temps | ansible.builtin.find: paths: /var/tmp/archiver-work age: 2d age_stamp: mtime register: old_files → — name: Remove | ansible.builtin.file: path: «{{ item.path }}» state: absent loop: «{{ old_files.files }}». Всегда с check_mode: yes сначала.
Нужно ли перезагружать сервер после массовой чистки /tmp?
Нет, если вы не удаляли открытые файлы (а tmpreaper/systemd-tmpfiles этого не делают). Если вручную удалили файлы, которые держит процесс — место вернётся только после рестарта этого процесса. Перезагрузка — грубый, но верный способ; лучше рестартнуть конкретный сервис.
Как настроить чистку для Docker-билдов, которые забивают диск слоями и кэшем?
Это отдельная тема: docker system prune -a —volumes —filter «until=72h» для неиспользуемых образов/контейнеров/томов, docker builder prune -a —filter «until=24h» для build cache. Не чистите /var/lib/docker/tmp вручную — управляйте через Docker CLI.
Материал носит информационный характер. При работе с производственными системами, данными клиентов или регулируемыми средами согласовывайте политику очистки временных файлов с владельцами сервисов, службой безопасности и администраторами хранения. Несанкционированное удаление может нарушить SLA, цепочки доказательства или требования соответствия.
