Обычно, когда заканчивается место на файловой системе — ищем растущие файлы (обычно это логи всякие) и удаляем их.
Итак, как правильно удалять файлы? ;)
Проверяем, что этот файл не открыт каким-нибудь процессом:
fuser /dir/filename

Если файл занят, что прибиваем процесс (или делаем корректные действия, чтобы процесс отпустил файл), после этого удаляем.

А что делать, если никто ничего не проверял, файлик грохнули, а вот место не освободилось?

Ищем процессы с открытыми файлами, у которых количество ссылок равно 0.
# find /proc/*/fd/* -type f -links 0
bash: /usr/bin/find: Arg list too long

Вот блин, слишком много процессов для find. Ок, пойдем другим путем:

# for i in `ls -1 /proc`;do find /proc/$i/fd -type f -links 0 -ls -exec file {} \; ;done
2403 0 -rw-rw---- 0 oracle dba 0 Dec 1 00:17 /proc/22973/fd/11
/proc/22973/fd/11: empty file
2403 0 -rw-rw---- 0 oracle dba 0 Dec 1 00:17 /proc/23095/fd/11
/proc/23095/fd/11: empty file
find: stat() error /proc/23165/fd: No such file or directory
find: stat() error /proc/23168/fd: No such file or directory
2403 0 -rw-rw---- 0 oracle dba 0 Dec 1 00:17 /proc/23289/fd/11
/proc/23289/fd/11: empty file
2403 0 -rw-rw---- 0 oracle dba 0 Dec 1 00:17 /proc/23291/fd/11
/proc/23291/fd/11: empty file
2403 0 -rw-rw---- 0 oracle dba 0 Dec 1 00:17 /proc/23293/fd/11
/proc/23293/fd/11: empty file
2403 0 -rw-rw---- 0 oracle dba 0 Dec 1 00:17 /proc/23298/fd/11
/proc/23298/fd/11: empty file
702090358 8 -rw------- 0 root root 20489865 Nov 30 16:48 /proc/912/fd/6
/proc/912/fd/6: data

Ну вот, похоже процесс, который держит файлик — 912.
Ну и дальше
# ps -f -p 912
UID PID PPID C STIME TTY TIME CMD
root 912 1 0 Nov 30 ? 5:45 /my-process.pl
# kill -9 912

6 комментариев на запись “Прибил файл, а место не освобождается?”

  1. ihanick пишет:

    ещё можно делать truncate файла, если программа открывает его в режиме APPEND (обычно все логи так работают)

    bash# :> /var/log/apache2/access.log

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

  2. Konstantin Khomoutov пишет:

    Это не процессов для find слишком много, а аргументов: «*» и прочие «globbing» символы раскрывает шелл перед запуском процесса; процесс видит уже набор готовых аргументов.

    Вместо ручной итерации по каталогам, достаточно: 1) сузить find’у поле деятельности (для некоторого ускорения), задав минимальную глубину поиска; 2) матчить не базовое имя файла (-name и т.п.), а полное (-path) чтобы выделить нужные каталоги. То есть вот так:

    find /proc -mindepth 3 -type f -path ‘/proc/*/fd/*’ …

    Конкретно по теме странность: в моей системе (Debian Lenny) дескрипторы файлов, открытых процессами, в /proc представлены симлинками, и сматчить их через -type f нельзя, только через -type l. Какой вывод из эого делать — мне не ясно.

  3. GOLDEN_key пишет:

    lsof ?

  4. google.com/accounts/o8… пишет:

    lsof не на каждой системе есть

  5. Gromf пишет:

    В HP-UX нет /proc (HP-UX have no /proc comcept), так что уберите тэг пока. Покопаю на досуге ps.

  6. akamit.com/blog/ пишет:

    lsof +L1 тоже неплохо