Linux удалить файл занятый процессом

Обновлено: 08.07.2024

Чтобы раз и навсегда внести ясность в этот вопрос и была написана эта статья.

Удаление открытого файла в Linux

Чтобы проверить как работает файловая система в Linux, проведем небольшой эксперимент.

Подготовка

Для проведения всех тестов нам необходима виртуальная машина с практически любым дистрибутивом Linux и дополнительный диск. Благо в век виртуализации это сделать проще простого. Для наглядности возьмем диск в пару гигабайт и заранее подготовим его (базовые операции с дисками рассмотрим в другой статье).

Представим, что вы впервые вошли по ssh на сервер, у вас рутовые права и ваша задача просто разобраться с дисковой подсистемой.

Свободное место и свободные иноды

Первое, что мы сделаем, это проверим диски всем знакомой командой df (лишние данные убраны из вывода):

/dev/mapper/test_disk_01-lv_test_01 1.5G 4.5M 1.4G 1% /mnt/data

Утилита отображает занятое на файловой системе место в блоках 1К. Этой информации в большинстве случаев хватает лишь для констатации факта о % свободного места и не стоит на этом останавливать диагностику.

Проблемы с записью новых файлов может вызвать также нехватка инодов (inodes), поэтому полезно будет их проверить той же командой, но с другим ключом:

/dev/mapper/test_disk_01-lv_test_01 98304 10 98294 1% /mnt/data

Используется 1% места на разделе. Запоминаем вывод команд, он нам понадобится для последующего анализа.

Создание файлов на диске

Далее создадим один большой файл на нашем диске. Сделать это проще всего утилитой dd, которая поставляется по умолчанию вместе с системой (предварительно создадим пару каталогов):

dd if = / dev / zero of = big / file .img bs = 1G count = 1

И ещё создадим 10 маленьких файлов, но другим способом:

Теперь снова смотрим два вывода df:

/dev/mapper/test_disk_01-lv_test_01 1.5G 1.1G 359M 75% /mnt/data

Как видно, теперь на диске занято 75%. А что с инодами?

/dev/mapper/test_disk_01-lv_test_01 98304 23 98281 1% /mnt/data

Количество инод изменилось на 13, хотя файлов мы создали всего 11.

Эксперимент с удалением открытого файла

Теперь посмотрим на ситуацию другой утилитой, которую также обязательно нужно использовать для диагностики. Речь о du:

Примерно занят 1ГБ.

Примечание: для изучения ключей наберите в консоли man du. Актуально также и для других утилит, рассматриваемых в статье.

Теперь сымитируем что-то похожее на блокировку файла (если будут предупреждения, соглашайтесь):

Команда просто открывает файл на чтение и отправляет задание в бэкграунд. Теперь удаляем файл:

После этого проверяем свободно место:

/dev/mapper/test_disk_01-lv_test_01 1.5G 1.1G 359M 75% /mnt/data

И свободные иноды:

/dev/mapper/test_disk_01-lv_test_01 98304 23 98281 1% /mnt/data

В итоге место не освободилось, хотя файл, казалось бы, удален. Инодов используется столько же. Но может быть du покажет нам что-то другое:

Занято 8Кб. Ок, есть ещё одна утилита, которая лучше других объяснит что происходит, это lsof:

COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME less 16483 root 3r REG 253,2 1073741824 11 /mnt/data/big/file.img (deleted)

Мы посмотрели все, что хотели, можно заканчивать.

Завершение эксперимента

Теперь снова проверяем свободное место:

/dev/mapper/test_disk_01-lv_test_01 1.5G 4.5M 1.4G 1% /mnt/data /dev/mapper/test_disk_01-lv_test_01 98304 22 98282 1% /mnt/data

Большой файл удалился, место и иноды освободились. Смысла проверять вывод du нет, она покажет то же самое, что и в предыдущий раз.

Выводы

Далее мы удалили файл, который открыт на чтение другим процессом. Команда rm удалила ссылку на файл, которую хранит объект каталога, но не смогла удалить файл физически с диска, поскольку файл был открыт на чтение другой программой.

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

В показаниях утилиты du также нет ничего странного, ведь она считывает все перечисленные имена файлов в каталоге и оценивает их размер. Поскольку ссылку на имя большого файла удалили, du не смогла оценить его объем, зато это смогла сделать df, ведь она оценивает реальный занятый объем на диске в блоках без привязки к именам. Вот весь секрет.

Эта небольшая заметка ориентирована на совсем начинающих. Сегодня мы рассмотрим как удалить файл linux через терминал. Для более опытных пользователей это элементарная задача, но новичкам надо с чего-то начинать. Знать как работать с файлами в консоли очень важно.

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

В Linux для удаления файлов предусмотрена стандартная утилита rm. Как и все остальные, стандартные утилиты в имени rm тоже заложена определенная идея. Это сокращение от английского слова Remove.

Удаление файлов в Linux

Чтобы удалить файл linux достаточно передать в параметрах команде адрес файла в файловой системе:

Чтобы удалить все файлы, начинающиеся на слово file можно использовать специальный символ *, означает любой символ в любом количестве:

Эта команда удаления файла в linux должна использоваться очень осторожно, чтобы не удалить ничего лишнего. В утилите есть опция -i, которая заставляет программу спрашивать пользователя перед тем, как удалить файл linux:

rm: удалить пустой обычный файл «/home/user/file»?

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

rm -f /home/user/file*

Для удаления директорий, вместе с файлами и поддиректориями используется опция -R, например:

rm -Rf /home/user/dir

Будет удалено все что находиться в папке dir, и эта папка. Только будьте бдительны, чтобы не получился знаменитый патч Бармина:

Не стоит выполнять эту команду в своей системе, как видите, она удаляет все файлы в файловой системе Linux.

Удаление файла в linux также возможно с помощью утилиты find. Общий синтаксис find:

find папка критерий действие

Например, мы хотим удалить файл linux по имени:

find . -type f -name "file" -exec rm -f <> \;

Будут найдены все файлы с именем file в текущей папке и для них вызвана команда rm -f. Можно не вызывать стороннюю утилиту, а использовать действие delete:

find . -type f -name "file" -delete

Удалить все файлы в текущей директории, соответствующие определенному регулярному выражению:

find . -regex '\./[a-f0-9\-]\.bak' - delete

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

find /path/to/files* -mtime +5 -exec rm <> \;

Будет выполнено удаление файлов через терминал все файлы в папке старше 5-ти дней.

Чтобы полностью стереть файл, без возможности восстановления используйте команду shred. Во время удаления файлов с помощью утилиты rm удаляется только ссылка на файл, само же содержимой файла по-прежнему находиться на диске, пока система не перезапишет его новыми данными, а пока этого не случится файл можно легко восстановить. Принцип действия утилиты такой - после удаления файла, его место на диске несколько раз перезаписывается.

Опцией -n - можно указать количество перезаписей диска, по умолчанию используется 3. А если указать опцию -z программа при последней перезаписи запишет все нулями чтобы скрыть, уничтожение файла.

Выводы

Вот и все. Теперь вы знаете как удалить файл в Ubuntu, как видите, делать это не так уж сложно. Если у вас остались вопросы, пишите в комментариях!

Кто-нибудь может знает, возможно ли удалить файл, в который идёт поток информации, т.е. файл открыт на запись другим преложением, а мне в какой-то определённый момент времени нужно его обнулить в Unix/Linux.

провобoвал echo > file echo -n > file head -c 0 > file cat /dev/null > file

раземр не сбрасывается!

931 1 1 золотой знак 8 8 серебряных знаков 12 12 бронзовых знаков Да, конечно не сбрасывается. По причинам как раз и описанным мною ниже.

Если файл не залочен (обычно это не делается), то его можно легко удалить. Однако, исчезновение файла из дерева файлов не будет означать его фактическое удаление. На самом деле, файл будет существовать до тех пор, пока приложение, выполняющее в него запись, не закроет его. В то же время, файл будет уже нельзя открыть. В таком промежуточном состоянии он будте продолжать занимать место на диске. Я не уверен, что это поведение воспроизводится на всех файловых системах, но под ext3 я точно наблюдал подобное.

PS: таким образом, ответ на ваш вопрос: всё-таки это плохая идея и стоит воздержаться от этого. Тем более, что это точно будет непереносимо на другие платформы (такие как Windows).

UPD: ответ для rtfm

lsof на вход принимает имя файла, а раз файл удалён, то и файла нет. Следовательно, lsof скажет, что файл не найден. Но на самом деле, тело файла всё ещё существует, хотя ссылок на него из дерева файлов уже нет.

19.9k 1 1 золотой знак 29 29 серебряных знаков 37 37 бронзовых знаков плевать! мненужно просто его обнулить! просто дело втом что тутад пишется видео поток, мне нужно просто скинуть его размер! Тогда надо понимать, что: а) видеопоток будет продолжать писаться в старый, уже "невидимый" файл; б) новый файл на месте старого создать будет можно, но они оба будут занимать место на диске. Таким образом, достичь успеха возможно лишь частично. Например, непонятно, каким образом вы продолжите запись видео в новый файл, если уже есть процесс, который пишет в старый.. тогда вам придётся его всё равно убить и запустить новый. Так вот в этом то и дело, надо не удалять файл а обнулить! То, что он будет писаться туда это ясно! А вот как сделать так чтобы он просто скинул размер! Нельзя сделать это снаружи. Надо заставить само приложение делать это. Это как с ротацией логов. Вы не можете просто взять и подменить лог-файл у приложения. Надо чтобы логгер самого приложения всё это делал. Не поню уже деталей, но, кажется, просто файл удаляется, а нода остаётся и ассоциация ноды с процессом где-то фигурирует.

Если приложение открывает файл с именем File на запись с O_APPEND, то > File в sh будет урезать файл (ls -l покажет это).

В противном случае размер, показываемый ls -l не уменьшится. Однако, если размер файла (в момент > ) превышает размер блока файловой системы (обычно 4 или 8 Kbyte), то du File покажет уменьшение файла.

Дело в следующем: Когда мы открываем файл с файловым дескриптором связана позиция в файле с которой проводится запись. Она (позиция) растет при каждом write(). Эти данные принадлежат процессу, открывшему файл. Когда другой процесс делает truncate(), размер файла в файловой системе безусловно уменьшается (и незанятые теперь блоки данных удаляются (точнее переходят в список свободных)). Однако это не затрагивает позицию записи в первом процессе (кстати, даже если сделать truncate в нем самом), поэтому при следующем write() из первого процесса длина файла возрастет. Если в этот момент прочесть файл (например cat File >fff из другого окошка), то в нем (от начала до последнего write()) будут двоичные нули.

Открытие файла с O_APPEND модифицирует поведение - при каждом write() позиция записи смещается в конец файла в соответствии с его текущим размером в файловой системе.

Надеюсь это справедливо для большинства Unix/Linux. В эмуляторах не проверял.

Удаление Папки и Файлов в Linux

Работать с командной строкой должен уметь каждый будущий системный администратор и опытный пользователь Linux. Сегодня мы рассмотрим ещё одну базовую функцию — удаление папки и файлов в Linux с помощью командной строки.

Прокачайте ваш Linux сервер, воспользовавшись скидками на VPS-хостинг в Hostinger! Большой выбор планов, как для учебных, так и для крупных коммерческих проектов.

Команда rmdir

Команда, используемая, чтобы удалить пустую папку в Linux через командную строку — это rmdir.

Основной синтаксис этой команды довольно простой. Вот пример:

  • rmdir — это команда
  • [опция] — опциональный модификатор, который изменяет поведение команды
  • НазваниеПапки — каталог, который вы хотите удалить

Если опция не указана, rmdir просто удаляет каталог, имя которого указано в качестве места назначения. Перед использованием этой команды вам нужно будет войти на сервер VPS через SSH. Вот статья, которая поможет вам это сделать.

Удаление Папки в Linux с Помощью Команды rmdir

Перед использованием команды rmdir мы рекомендуем вам проверить список файлов в каталоге с помощью команды ls. В нашем случае у нас есть каталог с названием Dir1.

Эта команда удалит пустой каталог с именем Dir1. Довольно просто, правда?

Вы также можете удалить несколько каталогов, разделив их имена пробелами. Например:

После выполнения этой команды каталоги с именами Dir1, Dir2 и Dir3 будут удалены.

Допустим, у нас есть папка Dir3. Dir3 содержит подкаталоги и файлы. Теперь, если мы используем команду:

То получим ошибку:

Как вы уже могли догадаться, rmdir работает только с пустыми каталогами.

Rmdir — умная утилита, которая позволяет удалять только пустые папки. Таким образом, она защищает данные от случайной потери. Помните, что удалённые данные в любом дистрибутиве Linux практически невозможно восстановить.

Опция -p позволяет удалить папку через командную строку, а также её родительские каталоги.

Эта команда удалит Dir3 и его родительские каталоги Dir2 и Dir1.

Опция -v выводит диагностический текст для каждого обработанного каталога. Использование этой опции выведет подтверждение со списком всех каталогов, которые были удалены.

Команда rm

Команда rmdir отлично подходит для безопасного удаления неиспользуемых и пустых каталогов. Если вы хотите удалить файл или каталог, содержащий файлы, вам придётся использовать команду rm.

Синтаксис этой команды похож на rmdir:

Как Удалить Файл в Linux с Помощью Команды rm

Давайте используем команду rm, чтобы удалить файл с именем article.txt:

Допустим, у нас есть каталог с именем Dir1, содержащий подкаталоги и файлы, чтобы удалить его, нам понадобится модификатор -r. Команда будет выглядеть так:

Опция -r рекурсивно удаляет каталоги и их содержимое.

Ещё одна полезная опция -i. Она попросит вас подтвердить удаление каждого отдельного файла, благодаря чему вы сможете избежать любых неприятных ошибок.

Вы также можете удалить пустые каталоги, используя опцию -d. Следующая команда удалит пустую папку с именем Dir1:

Вы можете использовать подстановочный знак (*) и обычные расширения для сопоставления нескольких файлов. Например, следующая команда удалит все файлы PDF в текущем каталоге.

Вы можете использовать вариации всех перечисленных выше команд для удаления файлов с другими расширениями, такими как .txt, .doc, .odt и другими.

Опция -f позволяет принудительно удалить всё, что находится в каталоге. Команда будет выглядеть так:

Приведённая выше команда рекурсивно и принудительно удалит всё, что находится в каталоге Dir1, не запрашивая подтверждения в терминале.

Вы также можете удалить несколько папок за раз. Следующая команда удалит три каталога Dir1, Dir2 и Dir3.

Поздравляем, вы успешно освоили основные функции команд rm и rmdir, позволяющие удалить файл или папку в Linux!

Итоги

Случайное удаление папки или даже одного файла в Linux может привести к серьёзным проблемам. Вот почему важно освоить две основные команды для удаления файлов и каталогов — rm и rmdir. В этой статье мы рассмотрели эти две команды и различные опции, которые позволяют их модифицировать.

Надеемся, что эта статья была полезной! И помните, что после удаления файла или каталога из Linux вы не сможете их восстановить, поэтому будьте предельно осторожны! Удачи.

Ольга уже около пяти лет работает менеджером в сфере IT. Написание технических заданий и инструкций — одна из её главных обязанностей. Её хобби — узнавать что-то новое и создавать интересные и полезные статьи о современных технологиях, веб-разработке, языках программирования и многом другом.

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

Удаление через rm

Для удаления файла, необходимо ввести команду rm и название документа.

Очищение документа

Данная команда удалит dokument, с некоторыми особенностями:

  • Интерпретатор запросит подтверждение на операцию.
  • В примере предполагается, что dokument находится в домашнем каталоге как и пользователь (/root/).

Удалим файл "newfile" из каталога /usr/games.

delete file

Удалить все файлы в папке.

Ключ "-f" даст возможность не выводить запрос на подтверждение операции. Однако, команда выше очистит только все файлы из каталога "games" не трогая директории.

Если нужно очистить систему от всех файлов, которые заканчиваются «.doc», следует приписать в самом конце команды символ «*», без пробела.

rm -f /usr/games/*.doc

Утилита Remove (rm) требует особой осторожности в работе. При халатном отношении к делу пользователь может навсегда стереть важные файлы.

Чтобы подобный казус не случился, рекомендуется совершать удаление файлов при помощи стандартной программы rm с добавлением опции -i. Она станет некой перестраховкой в данном вопросе – система начнет запрашивать подтверждение пользователя перед удалением файлов из каталога. Как это выглядит на практике:

Если пользователю не нужен запрос на подтверждение, и он на 100% уверен в правильности своих дальнейших действий, можно вписать в команду опцию с противоположным воздействием на процесс (-f).

rm -i /usr/games/*.doc

Удаление через find

Для реализации задуманного можно воспользоваться еще одной альтернативной программой find. Кроме того, она пригодится даже там, где rm не осилит поставленную задачу. Её синтаксис выглядит следующим образом:

$ find папка критерий действие

К примеру, пользователю нужно очистить текущий каталог от всех файлов с названием «file». Их можно найти и уничтожить следующим способом:

find . -type f -name «file» -delete

Чтобы удалить устаревшие логи (то есть, файлы старше конкретного срока), используйте специальную команду в виде:

$ find /path/to/files* -mtime +5 –exec rm <> \;

Исходя из заданной команды, можно понять, что Линукс удалит из текущего каталога все файлы, «возраст» которых превышает 5 дней. Вот видите, как легко управлять устройством посредством терминала!

Иногда в Linux наличествуют файлы, восстановление которых не имеет ни малейшей актуальности посте чистки ПК. То есть, от них нужно избавиться раз и навсегда. Если использовать ранее упомянутую программу rm, то ничего не получится, поскольку она удаляет лишь ссылку на файл, сохраняя при этом его содержимое в памяти устройства. Он все еще будет поддаваться восстановлению, ровно до того момента, пока Линукс не перезапишет его иной информацией.

Через shred

Чтобы очистить систему от документа без возможности его дальнейшего восстановления, нужно использовать специальную команду под названием «shred». Как только срабатывает команда, файл удаляется, и система неоднократно перезаписывает его место на диске. Как это выглядит на практике:

Что происходит далее? Система перезаписывает место на диске 3 раза (по умолчанию), но это количество поддается коррективам. Используйте опцию -n, если нужно что-то поменять. Добавление опции -z также повлияет на итоговый результат. С ней система запишет место на диске нулями, чтобы никто не мог догадаться о том, что определенный файл был уничтожен пользователем.

Читайте также: