Как очистить заблокированный файл linux

Поиск и удаление заблокированных файлов в Linux

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

Для этих целей нам понадобятся утилиты lsof и lslk.

Рассмотрим пример на основе дистрибутива Ubuntu.

Инсталируем необходимые пакеты (должен быть подключен репозиторий universe) —
# sudo apt-get update
# sudo apt-get install lsof lslk

Теперь все необходимые нам инструменты присутствуют.

Для примера мы будем искать и удалять заблокированные файлы KDE сессий на общем хранилище, где храняться и смонтированы на локальные машины, домашние каталоги пользователей (NFS)

Итак запускаем lslk
# lslk
SRC PID DEV INUM SZ TY M ST WH END LEN NAME
(unknown) 1190 254,1 308115263 r 0 0 0 0 0 /mnt/homes (/dev/mapper/vg0-homes)
(unknown) 2294 254,1 308115263 r 0 0 0 0 0 /mnt/homes (/dev/mapper/vg0-homes)
(unknown) 2392 254,1 308115263 r 0 0 0 0 0 /mnt/homes (/dev/mapper/vg0-homes)
(unknown) 2397 254,1 308115263 r 0 0 0 0 0 /mnt/homes (/dev/mapper/vg0-homes)
lpd 3028 254,0 1212425 5 w 0 0 0 0 0 /var/run/lpd.pid
master 3187 254,0 262203 17 w 0 0 0 0 0 /var/spool/postfix/pid/master.pid
atd 3260 254,0 1212456 5 w 0 0 0 0 0 /var/run/atd.pid
(unknown) 3262 254,0 1212458 w 0 0 0 0 0 /var (/dev/mapper/vg0-var)
nmbd 14654 254,0 688137 32768 r 0 4 0 4 0 /var/lib/samba/public/unexpected.tdb
nmbd 14654 254,0 688148 696 r 0 4 0 4 0 /var/lib/samba/public/messages.tdb
nmbd 14654 254,0 1212429 6 w 0 0 0 0 0 /var/run/samba/public/nmbd.pid
smbd 14656 254,0 688138 8192 r 0 4 0 4 0 /var/lib/samba/public/locking.tdb
smbd 14656 254,0 688132 8192 r 0 4 0 4 0 /var/lib/samba/public/brlock.tdb
smbd 14656 254,0 688133 163840 r 0 4 0 4 0 /var/lib/samba/public/connections.tdb
smbd 14656 254,0 688147 188416 r 0 4 0 4 0 /var/lib/samba/public/sessionid.tdb
smbd 14656 254,0 688148 696 r 0 4 0 4 0 /var/lib/samba/public/messages.tdb
smbd 14656 254,0 1212430 6 w 0 0 0 0 0 /var/run/samba/public/smbd.pid
nmbd 14669 254,0 655876 32768 r 0 4 0 4 0 /var/lib/samba/users/unexpected.tdb
nmbd 14669 254,0 655875 696 r 0 4 0 4 0 /var/lib/samba/users/messages.tdb
nmbd 14669 254,0 1212448 6 w 0 0 0 0 0 /var/run/samba/users/nmbd.pid
smbd 14671 254,0 655870 8192 r 0 4 0 4 0 /var/lib/samba/users/locking.tdb
smbd 14671 254,0 655719 696 r 0 4 0 4 0 /var/lib/samba/users/brlock.tdb
smbd 14671 254,0 655718 57344 r 0 4 0 4 0 /var/lib/samba/users/connections.tdb
smbd 14671 254,0 655843 106496 r 0 4 0 4 0 /var/lib/samba/users/sessionid.tdb
smbd 14671 254,0 655875 696 r 0 4 0 4 0 /var/lib/samba/users/messages.tdb
smbd 14671 254,0 1212450 6 w 0 0 0 0 0 /var/run/samba/users/smbd.pid

Что интересно, в этом листинге первые четыре строки помечены как unknown
S RC PID DEV INUM SZ TY M ST WH END LEN NAME
(unknown) 1190 254,1 308115263 r 0 0 0 0 0 /mnt/homes (/dev/mapper/vg0-homes)
(unknown) 2294 254,1 308115263 r 0 0 0 0 0 /mnt/homes (/dev/mapper/vg0-homes)
(unknown) 2392 254,1 308115263 r 0 0 0 0 0 /mnt/homes (/dev/mapper/vg0-homes)
(unknown) 2397 254,1 308115263 r 0 0 0 0 0 /mnt/homes (/dev/mapper/vg0-homes)

Мы получили достаточно полную информацию в этом листинге, мы знаем какие файлы используются в нашей файловой системе (в нашем случае нас интересует /mnt/home), нам понадобятся PID процессов. Для более подробного вывода параметров обратитесь к документации lslk.

Итак мы видим, что четыре процесса используют какие-то файлы из /mnt/homes, попробуем найти файлы используемые этими процессами.

Для этого нам пригодится утилита lsof
# lsof -p 1190,2294,2392,2397
Выводом этой команды будет список всех файлов перечисленных процессов. Правда иногда мы можем не получить желаемого результата.

Тогда можно попробовать найти файл по номеру inode —
# find /mnt/homes -inum 308115263
/mnt/homes/home/foo/.qt/.qtrc.lock

Заблокированный файл найден, удаляем его
# rm -f /mnt/homes/home/foo/.qt/.qtrc.lock

Таким образом мы удалили все заблокированные файлы и можем запускать наше приложение снова.

Читайте также:  После переустановки windows ноутбук не видит вай фай

Источник

Как удалить файл через терминал Linux

Эта небольшая заметка ориентирована на совсем начинающих. Сегодня мы рассмотрим как удалить файл 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, как видите, делать это не так уж сложно. Если у вас остались вопросы, пишите в комментариях!

Читайте также:  Step by step windows server 2016

Источник

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

Есть ряд каверзных вопросов по Linux, которые вводят в ступор большинство начинающих системных администраторов Linux. Их очень любят задавать на собеседованиях бывалые админы, а в интернете про ответы на них не написал только ленивый. В топе уже наверно полтора десятилетия держится вопрос про удаление открытого файла в Linux. Тем не менее кандидаты все также из раза в раз продолжают делать круглые глаза. Максимум, что от них можно услышать — это «Иноды. Я слышал про иноды, но больше про них ничего не знаю».

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

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

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

Подготовка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сворачиваем наш эксперимент — убиваем процесс, который мы ранее запустили в фоновом режиме:

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

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

Читайте также:  Средство исправления неполадок центра обновления windows

Выводы

Что все же произошло? А произошло следующее: информация от du и df до удаления большого файла была очевидной и объяснений не требует. За исключением одного момента — почему файлов создали 11, а количество инодов увеличилось на 13? Тут все просто. Наверно все слышали выражение, что все в линуксе — файл 1 ? И каталог тоже, а их мы создали два.

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

Хоть файл уже и не имел имени, но все ещё имел файловый дескриптор (= инод), к которому продолжала обращаться программа. Это было также хорошо заметно по выводу lsof — файл был помечен как удаленный. Как только программу остановили, файл освободился и система смогла завершить начатое — удалить файл и зависимые структуры данных на диске окончательно.

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

Источник

Разблокировать сетевые файлы, заблокированные Samba Linux / Unix Server

Samba – бесплатное программное обеспечение Linux / Unix, которое обеспечивает доступ к файлам и печати для клиентов Microsoft Windows.

Если у вас есть файловый сервер Linux или устройство NAS на базе Linux в сети с клиентами Windows, вы, вероятно, используете Samba.

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

Могут быть ситуации, когда вам нужно принудительно разблокировать файл, например, когда файл был закрыт, но блокировка не была должным образом выпущена Samba.

К сожалению, Samba не позволяет разблокировать отдельные файлы.

Однако есть несколько способов обхода.

Перезапуск Samba

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

Чтобы перезапустить samba, запустите:

Команда может немного отличаться в зависимости от вашего дистрибутива Linux.

Убейте пользовательский PID

Лучший вариант – убить процесс Samba, который блокирует файл.

Samba назначает отдельный процесс каждому подключенному пользователю.

Таким образом будут заблокированы только файлы, заблокированные этим конкретным пользователем.

Он не будет отключать соединение так же, как и перезапуск samba.

и найдите заблокированный файл.

Номер PID (первый столбец)

Если список очень длинный, и вы пытаетесь найти файл:

где filename.ext – это имя заблокированного файла.

Эта команда будет фильтровать результаты smbstatus и возвращать только строки с заблокированным файлом.

Вы также можете проверить, какие другие файлы открыл этот пользователь, проверив результаты smbstatus или выполнив:

где номер PID пользователя 14899

Если возможно, попросите пользователя закрыть все файлы, открытые с этого конкретного сервера.

Наконец, чтобы разблокировать все файлы, которые этот пользователь открыл, запустите

Источник

Оцените статью