Безопасная очистка временных файлов после работы с архивами: принципы, методы и контроль

При работе с архивами — سواء это ручная распаковка, автоматическая обработка в скриптах или анализ содержимого антивирусами и DLP-системами — на диске остаются временные файлы. Если их не удалять, диск заполняется мусором; если удалять неаккуратно, можно сломать запущенные процессы или потерять данные, которые ещё не записаны в итоговое хранилище. В этой статье разбираем, где именно появляются такие файлы, как их идентифицировать, какие методы удаления безопасны в разных сценариях и как организовать контроль, чтобы очистка не стала причиной инцидента.

Содержание
  1. Откуда берутся временные файлы при работе с архивами
  2. Риски неправильной очистки
  3. Как идентифицировать файлы, безопасные для удаления
  4. 1. Принадлежность к процессу
  5. 2. Возраст и признаки «брошенности»
  6. 3. Наличие результата в целевом хранилище
  7. Ручные методы очистки
  8. Windows: встроенные средства
  9. Linux: командная строка и системные таймеры
  10. Автоматизация в скриптах и конвейерах (CI/CD, ETL, бэкапы)
  11. Принцип «чистим за собой сразу»
  12. Изоляция рабочих директорий
  13. Очистка при аварийном завершении контейнера/пода
  14. Специфические сценарии и нюансы
  15. Антивирусные сканеры и DLP
  16. Архиваторы с GUI (WinRAR, 7-Zip, PeaZip)
  17. Многотомные архивы и восстановление
  18. Зашифрованные архивы и пароли
  19. Сравнение подходов к очистке
  20. Типичные ошибки и как их избежать
  21. Чек-лист перед массовой очисткой на проде
  22. Сценарии: как действовать в типичных ситуациях
  23. Мониторинг и предупреждение
  24. Практический следующий шаг
  25. 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: встроенные средства

  1. Очистка диска (cleanmgr.exe): безопасен, но консервативен — удаляет только файлы старше 7 дней из системных TEMP и корзины. Не трогает пользовательские рабочие папки.
  2. Storage Sense (Windows 10/11): настраиваемая автоматика: удаление файлов из Downloads и Recycle Bin по возрасту, очистка TEMP при нехватке места. Включается в Settings → System → Storage.
  3. Ручное удаление через Explorer: зайдите в %TEMP% (Win+R → %TEMP%), сортируйте по дате изменения, выделяйте старые папки с понятными именами (7zO1234.tmp, Rar$EX00.123), удаляйте. Если файл занят — система не даст удалить.
  4. 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: командная строка и системные таймеры

  1. 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 раз в сутки).

  2. 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″‘ _ {} \;
  3. 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, os

    with 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 TERM

    7z 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-блокировками.

Чек-лист перед массовой очисткой на проде

  1. Соберите список целевых директорий (системные + кастомные из конфигов приложений).
  2. Проверьте, какие процессы пишут туда сейчас (lsof +D /path / Resource Monitor).
  3. Остановите или переведите в maintenance окно сервисы-писатели, если возможно.
  4. Запустите dry-run: find /target -type f -mtime +N -print (или tmpreaper —test). Оцените объём и список.
  5. Убедитесь, что в списке нет файлов текущих запусков (по PID, по времени запуска сервиса).
  6. Выполните удаление с логированием: tmpreaper —verbose или скрипт с tee -a /var/log/tmpclean.log.
  7. Проверьте освободившееся место: df -h /target, df -i /target.
  8. Перезапустите остановленные сервисы, убедитесь в их здоровье.

Сценарии: как действовать в типичных ситуациях

  • Диск забит на 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, цепочки доказательства или требования соответствия.

PEFile.ru