Как определить, какой процесс пишет в файл (не лог) в Linux?

«Как определить, какой процесс пишет в файл (не лог) в Linux?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps для отслеживания неавторизованных изменений файлов используются следующие методы:

1. Мониторинг в реальном времени с inotifywait (для оперативного реагирования)

# Установка инструмента
sudo apt-get install inotify-tools  # Debian/Ubuntu
sudo yum install inotify-tools      # RHEL/CentOS

# Мониторинг конкретного файла
inotifywait -m -e modify /path/to/config/file

# Комбинированный подход: при изменении сразу показываем процесс
inotifywait -m -e modify /path/to/file --format '%w%f' | 
while read file; do
    echo "Файл $file изменен. Процесс:"
    lsof "$file" | grep -v COMMAND
    echo "---"
end

2. Системный аудит с auditd (для compliance и безопасности)

# Настройка правила аудита
sudo auditctl -w /etc/important.conf -p wa -k config_changes

# Просмотр событий
sudo ausearch -k config_changes -i

# Постоянные правила (добавить в /etc/audit/rules.d/)
-w /etc/nginx/ -p wa -k nginx_config_changes
-w /etc/passwd -p wa -k sensitive_file_changes

3. Отладка работающего процесса с strace

# Отслеживать все системные вызовы write для процесса
sudo strace -p 1234 -e trace=write 2>&1 | grep -A2 -B2 "путь_к_файлу"

# Альтернатива: отслеживать только операции с конкретным файлом
sudo strace -p 1234 2>&1 | grep -E "open.*путь|write.*путь"

4. Использование fatrace для отслеживания всей файловой активности

# Мониторить все операции записи в системе
sudo fatrace | grep "W.*путь_к_файлу"

DevOps-практика:

  • Конфигурационный дрифт: обнаружение изменений конфигов вне системы управления (Ansible/Puppet)
  • Безопасность: выявление несанкционированной записи в системные файлы
  • Отладка: определение процесса, который портит общий ресурс (файл блокировки, кэш)