Перейти к содержанию

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.

  1. Сузить круг подозреваемых: top, htop, ps aux — по CPU, памяти, имени процесса.
  2. Подключиться к PID (пример: 1234):
sudo strace -p 1234 -e write -o /tmp/strace.log
  • -p — отслеживать существующий процесс.
  • -e write — только вызовы write (при необходимости расширьте список syscalls).
  • -o — лог в файл; в интерактиве смотрите вывод в терминале без -o.

Остановить трассировку — Ctrl+C. В логе ищите путь к нужному файлу или соответствующий FD.


См. также