Как контролировать открытые файлы процесса в реальном времени?

Я знаю, что могу просмотреть открытые файлы процесса, используя lsof в тот момент на моей машине Linux. Тем не менее, процесс может открывать, изменять и закрывать файл так быстро, что я не смогу его увидеть, наблюдая его, используя стандартные сценарии оболочки (например, watch ), как описано в «Мониторинг открытых файлов процессов в Linux (в режиме реального времени) " .

Итак, я думаю, что я ищу простой способ проверки процесса и посмотреть, что он сделал за время. Было бы замечательно, если бы можно было увидеть, какие сетевые подключения он попытался сделать и провести аудит, прежде чем процесс успеет запустить без запуска аудита.

В идеале я хотел бы сделать это:

 sh $ audit-lsof /path/to/executable 4530.848254 OPEN read /etc/myconfig 4530.848260 OPEN write /var/log/mylog.log 4540.345986 OPEN read /home/gert/.ssh/id_rsa <-- suspicious 4540.650345 OPEN socket TCP ::1:34895 -> 1.2.3.4:80 | [...] 4541.023485 CLOSE /home/gert/.ssh/id_rsa <-- would have missed 4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80 | this when polling 

Можно ли использовать strace и некоторые флаги, чтобы не видеть каждый системный вызов?

One Solution collect form web for “Как контролировать открытые файлы процесса в реальном времени?”

Запуск с

 strace -e trace=open,close,read,write,connect,accept your-command-here 

вероятно, будет достаточным.

Вам нужно будет использовать опцию -o чтобы вывести вывод strace куда-нибудь, кроме консоли, если процесс может печатать на stderr. Если у вас вилки процесса, вам также понадобится -f или -ff .

О, и вам может понадобиться -t , так что вы можете видеть, когда произошли звонки.


Обратите внимание: вам может потребоваться настроить список вызовов функций в зависимости от того, что делает ваш процесс – мне нужно было добавить getdents например, чтобы получить лучший пример с помощью ls :

 $ strace -t -e trace=open,close,read,getdents,write,connect,accept ls >/dev/null ... 09:34:48 open("/etc/ld.so.cache", O_RDONLY) = 3 09:34:48 close(3) = 0 09:34:48 open("/lib64/libselinux.so.1", O_RDONLY) = 3 09:34:48 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@V\0\0\0\0\0\0"..., 832) = 832 09:34:48 close(3) = 0 ... 09:34:48 open("/proc/filesystems", O_RDONLY) = 3 09:34:48 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 366 09:34:48 read(3, "", 1024) = 0 09:34:48 close(3) = 0 09:34:48 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3 09:34:48 close(3) = 0 09:34:48 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3 09:34:48 getdents(3, /* 5 entries */, 32768) = 144 09:34:48 getdents(3, /* 0 entries */, 32768) = 0 09:34:48 close(3) = 0 09:34:48 write(1, "file-A\nfile-B\nfile-C\n", 21) = 21 09:34:48 close(1) = 0 09:34:48 close(2) = 0 
  • «Netstat -p» / «ss -p» не показывает процесс прослушивания порта
  • Не удалось отобразить содержимое каталога: процесс бесконечно бесконечно
  • lsof: измерять скорость ввода-вывода сокета fd
  • В AIX, как я могу получить полный путь к программе, связанной с портом?
  • Команда для уничтожения определенного PID, предоставленного предыдущей командой
  • Отслеживание файлов, которые используются программой
  • Разный выход варианта lsof
  • Активность дискового диска FreeBSD 10
  • lsof не возвращает файлы, открытые одним и тем же пользователем
  • Как я могу выяснить, из каких pty из qemu?
  • Что такое смещение файла в lsof output?
  • lsof: домашняя папка занята, но я никогда не вошел в систему как этот пользователь
  • Linux и Unix - лучшая ОС в мире.