student@ubuntu:~$ lsof /tmp/lk
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
flock 1094 student 3rW REG 253,4 0 2703 /tmp/lk
sleep 1096 student 3r REG 253,4 0 2703 /tmp/lk
flock 1112 student 3r REG 253,4 0 2703 /tmp/lk
FD — номер дескриптора, затем режим: r — чтение, w — запись, u —
оба. Третья буква — блокировка файла: W — на запись всего файла, R —
на чтение всего файла, w и r — на часть файла. Вместо номера бывают
cwd (текущий каталог), txt (файл программы), mem (файл в памяти).
Здесь flock 1094 держит блокировку (3rW), sleep 1096 — его потомок с
тем же открытым файлом, а flock 1112 открыл файл и ждёт: буквы
блокировки у него нет. Ждущих видно и в /proc/locks (см.
proc-filesystem).
Удалённые файлы: +L1 и DEL
Файл, который удалили или заменили новым, живёт, пока его держит процесс
— это удалённый открытый файл. lsof +L1
показывает открытые файлы, у которых не осталось имени на диске. Так
выглядит служба, чей бинарь заменили при обновлении:
student@ubuntu:~$ sudo lsof +L1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME
demo-slee 4214 root txt REG 253,4 35336 0 4464
/usr/local/bin/demo-sleep (deleted)
NLINK 0 — имён у файла нет, txt — это файл программы.
Удалённую общую библиотеку в памяти процесса
+L1 не показывает: такой файл не открыт, а отображён в память. У lsof
по процессу он отмечен DEL в столбце FD:
student@ubuntu:~$ sudo lsof -p 3830 | grep -E 'COMMAND|DEL'
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sleep 3830 root DEL REG 253,4 2727
/usr/local/lib/libdemo.so.1
Те же файлы с пометкой (deleted) — в /proc/<PID>/maps (см.
proc-filesystem). Заменённый файл освобождается только с
перезапуском процесса.