Поиск и удаление заблокированных файлов в 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
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)

Мы получили достаточно полную информацию в этом листинге, мы знаем какие файлы используются в нашей файловой системе (в нашем случае нас интересует /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

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

Интересное на сайте: 
0
Голосов пока нет