Поиск и удаление заблокированных файлов в 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
Таким образом мы удалили все заблокированные файлы и можем запускать наше приложение снова.