11. Дополнительные материалы
Короткие практические разборы, которые часто встречаются на собеседованиях и в эксплуатации. Здесь — поиск процесса, который пишет в файл; см. также 4. Процессы, CPU, память и 10. Troubleshooting.
Практический вопрос: кто пишет в файл?
В Linux надёжнее всего опираться на lsof и fuser: они читают /proc и показывают открытые дескрипторы в читаемом виде. Если нужно доказать факт записи на уровне syscalls — strace.
lsof: кто держит файл открытым
Показывает процессы, которые читают, пишут или иначе используют inode этого файла.
lsof /path/to/file
Пример для системного лога:
lsof /var/log/syslog
Типичный фрагмент вывода:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 1234 syslog 4w REG 8,1 1048576 789123 /var/log/syslog
FD— дескриптор; суффиксwуказывает на открытие на запись (в т.ч. append).- Если вывода нет, в момент запроса ни один процесс не держал этот путь открытым (файл могли закрыть или пишут в другой путь после ротации лога).
fuser: быстро получить PID
Удобно, когда нужен только идентификатор процесса.
fuser /path/to/file
Пример вывода:
/var/log/syslog: 1234
Для подробностей можно добавить флаги вроде -v (зависит от версии psmisc).
strace: когда lsof/fuser не хватает
Имеет смысл, если файл не «держится» открытым постоянно (короткие записи, другой путь после ротации) или нужно увидеть реальные вызовы write.
- Сузить круг подозреваемых:
top,htop,ps aux— по CPU, памяти, имени процесса. - Подключиться к PID (пример:
1234):
sudo strace -p 1234 -e write -o /tmp/strace.log
-p— отслеживать существующий процесс.-e write— только вызовыwrite(при необходимости расширьте список syscalls).-o— лог в файл; в интерактиве смотрите вывод в терминале без-o.
Остановить трассировку — Ctrl+C. В логе ищите путь к нужному файлу или соответствующий FD.
См. также
- 4. Процессы, CPU, память — процессы,
top,ps. - 10. Troubleshooting: подход production-инженера — в т.ч. удалённые, но ещё открытые файлы и
lsof +L1.