Как восстановить удалённый файл в Linux после rm, если процесс продолжает писать

Как восстановить удалённый файл в Linux, если процесс продолжает в него писать (2026)

Вы случайно удалили файл журнала (*.log), а процесс (nginx, rsyslog, PostgreSQL, Java-приложение и т.д.) продолжает в него писать. В ls файла уже нет, но данные никуда не исчезли. Их можно быстро восстановить, пока процесс не завершился.

Этот метод работает на всех популярных дистрибутивах: Ubuntu,Debian,Astra Linux, CentOS, Rocky Linux, AlmaLinux, Red Hat, Alt Linux и других.

Как восстановить удалённый лог-файл в Linux (nginx, rsyslog) пока процесс пишет
Как восстановить удалённый лог-файл в Linux (nginx, rsyslog) пока процесс пишет

Почему rm не удаляет данные сразу?

Команда rm лишь убирает запись из каталога и уменьшает счётчик жёстких ссылок (nlink). Пока хотя бы один процесс держит файл открытым, ядро Linux сохраняет inode и все данные на диске.

Это «окно восстановления» особенно велико для логов веб-серверов, баз данных и систем мониторинга.

Шаг 1: Находим процесс, который держит удалённый файл

Установите утилиту lsof, если её нет:

# Debian / Ubuntu / Astra Linux

sudo apt update && sudo apt install lsof -y

Или

# Rocky / Alma / CentOS / RHEL / Fedora / Alt

sudo dnf install lsof -y

Поиск удалённых файлов:

sudo lsof +L1 | grep deleted

или более точно по имени:

sudo lsof +L1 | grep -E 'access.log|error.log|syslog'

Пример вывода:

nginx 1423 www-data 4w REG 253,1 204800 0 131074 /var/log/nginx/access.log (deleted)

Важные столбцы:

  • 2-й — PID процесса
  • 4-й — файловый дескриптор (например 4w)
  • Последний — путь к файлу

Шаг 2: Восстанавливаем файл через /proc

# Пример для nginx

sudo cp /proc/1423/fd/4 /var/log/nginx/access.log.recovered

Проверьте результат:

ls -lh /var/log/nginx/access.log.recovered

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

sudo systemctl restart nginx

Удобный bash-скрипт для быстрого восстановления (рекомендуется)

Добавьте функцию в ~/.bashrc или /etc/profile.d/recover.sh:

recover_deleted() {
    local filename="$1"
    local output="${2:-/tmp/recovered_$(basename "$filename")}"
    
    local result
    result=$(sudo lsof +L1 2>/dev/null | grep -i "$filename" | head -n1)
    
    if [[ -z "$result" ]]; then
        echo "❌ Процесс, открывший файл $filename, не найден."
        return 1
    fi
    
    local pid fd
    pid=$(echo "$result" | awk '{print $2}')
    fd=$(echo "$result" | awk '{print $4}' | tr -d 'rwu')
    
    echo "✅ Найден процесс: PID=$pid, FD=$fd"
    sudo cp "/proc/${pid}/fd/${fd}" "$output" && \
    echo "✅ Файл успешно восстановлен: $output"
}

Использование:

recover_deleted "/var/log/nginx/access.log" "/var/log/nginx/access.log.recovered"

Что делать, если несколько процессов держат файл?

sudo ls -lh /proc/*/fd/* 2>/dev/null | grep -E 'log.*deleted'

Выбирайте дескриптор с самым большим размером.

Профилактика случайного удаления логов

  1. Жёсткая ссылка (самый простой способ):

ln /var/log/nginx/access.log /var/log/nginx/access.log.backup

  1. Используйте chattr +i для важных файлов (требует прав root).
  2. Настройте ротацию логов через logrotate с правильными параметрами.

Когда метод /proc уже не поможет?

Если процесс завершился, то данные могут быть перезаписаны. Тогда остаются инструменты:

  • testdisk / photorec
  • extundelete (только для ext4)
  • foremost, scalpel

Важно: никогда не восстанавливайте на смонтированной в режиме rw файловой системе.

FAQ

Можно ли восстановить файл после rm в Linux?
Да, можно, если процесс ещё держит файл открытым. Команда rm не удаляет данные сразу, пока файл используется процессом.
Как найти удалённый файл в Linux?
Используйте команду sudo lsof +L1 | grep deleted или sudo lsof +L1 | grep имя_файла.
Что делать, если при копировании из /proc появляется Permission denied?
Запускайте команду с sudo. Также проверьте, что процесс с этим PID всё ещё работает.
Работает ли способ на Astra Linux, Red OS, Ubuntu, CentOS и Rocky Linux?
Да, метод универсальный и работает на всех современных дистрибутивах Linux.
Что будет, если процесс уже завершился?
Данные перестанут быть доступны через /proc. Придётся использовать testdisk, photorec или extundelete (успех не гарантирован).
Можно ли восстановить несколько удалённых файлов сразу?
Да. Выполните sudo lsof +L1, найдите нужные дескрипторы и скопируйте каждый из них.
Безопасно ли копировать файл из /proc//fd/?
Полностью безопасно. Вы только читаете данные, процесс при этом не затрагивается.
Как защитить логи от случайного удаления?
Создайте жёсткую ссылку (ln), используйте chattr +i или настройте правильную ротацию через logrotate.
Нужно ли перезапускать сервис после восстановления файла?
Рекомендуется. После восстановления перезапустите сервис, чтобы он начал писать в новый файл.
Восстановится весь файл или только часть?
Восстанавливается всё содержимое, которое было записано на момент копирования. Новые данные продолжат идти в старый дескриптор.
Актуален ли этот метод восстановления в 2026 году?
Да, механизм /proc/fd остаётся стандартным в Linux и продолжает отлично работать.

Заключение

Знание механизма /proc/<PID>/fd/ это один из самых полезных «чит-кодов» Linux-администратора. Метод работает мгновенно и спасает в продакшене десятки раз.

Популярные поисковые запросы по теме:

  • восстановить удалённый файл linux
  • rm удалил лог файл процесс пишет
  • lsof deleted
  • восстановление через /proc/fd

Сохраните статью или добавьте функцию recover_deleted и в следующий раз, когда в 3 часа ночи упадёт лог, вы решите проблему за минуту.

Хотите версию статьи под конкретный дистрибутив (Astra, Rosa, Red OS, Ubuntu Server и т.д.), то напишите в комментариях.

Понравилась статья?

Помогите Setiwik.ru создавать больше глубоких обзоров и новостей. Один клик и ваш вклад помогает держать серверы включёнными и авторов мотивированными!

Спасибо, что вы с нами!

Nazario

Я Назар. Уже больше десяти лет я работаю с Linux и Windows системами каждый день. Это моя основная профессия и большая часть жизни.
Всё, что ты читаешь на Setiwik.ru, начинается с официальной документации, мануалов и технических спецификаций. Я их изучаю очень внимательно. Но ценность статей появляется именно тогда, когда я беру эту базу и пропускаю через десятки реальных ситуаций: ночные аварии, странные баги, которые не гуглятся с первого раза, выстраданные конфиги и проверенные обходные пути.
Я не обещаю истину в последней инстанции. Но если мой опыт поможет тебе сэкономить хотя бы пару часов нервов и перезагрузок, значит всё это было не зря. Здесь только практика: от тонкой настройки серверов до самых неожиданных ситуаций, которые официальные руководства обычно обходят стороной.
Setiwik.ru это место, где IT становится понятнее и спокойнее. Заходи почаще. Будем разбираться вместе.

А ещё с этого года я официально помогаю малому бизнесу Новороссийска не тратить время и деньги на постоянные IT-проблемы.
Под брендом Novoross-IT предлагаю абонентское обслуживание компьютеров: профилактика, резервные копии, настройка сетей, быстрое решение любых сбоев и ежемесячные отчёты.

Сейчас я могу приехать к тебе в офис на бесплатный аудит и показать реальное состояние твоей техники и сетей. Часто после такого аудита владельцы удивляются, сколько мелких рисков они уже носили в себе.

Подробности здесь: novoross-it.ru

Практические инструкции по Windows и Linux
Добавить комментарий