Есть ли способ перехватить межпроцессное взаимодействие в Unix / Linux?

Для перехвата / анализа сетевого трафика у нас есть утилита Wireshark .

У нас есть аналогичная утилита для перехвата всей межпроцессной связи между любыми двумя процессами в Unix / Linux?

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

  • Как реализовать «генераторы», такие как $ RANDOM?
  • Как передать пароль дочернему процессу?
  • Как перечислить все пути объекта в службе dbus?
  • Различия между доменными сокетами Unix и сетевыми сокетами?
  • В чем смысл объектов dbus?
  • IPC: уведомление об отключенной общей памяти
  • Какие основные механизмы IPC на уровне ядра существуют в Linux?
  • К какой группе процессов относится моя программа, когда она начинается с bash?
  • 2 Solutions collect form web for “Есть ли способ перехватить межпроцессное взаимодействие в Unix / Linux?”

    Это сильно зависит от механизма связи.

    • В самом прозрачном конце спектра процессы могут взаимодействовать с использованием интернет-сокетов (например, IP ). Затем wirehark или tcpdump могут отображать весь трафик, указывая его на интерфейс loopback.

    • На промежуточном уровне движение по трубам и разъемам unix можно наблюдать с помощью truss / strace / trace / …, швейцарской армейской цепной системы для отслеживания системы. Это может значительно замедлить процессы, поэтому может оказаться непригодным для профилирования.

    • На самом непрозрачном конце спектра есть разделяемая память. Основной принцип работы разделяемой памяти заключается в том, что в каждом задействованном процессе доступ полностью прозрачен, вам нужно только системные вызовы для настройки разделяемых областей памяти. Отслеживание этих обращений к памяти извне было бы затруднительным, особенно если вам нужно наблюдение, чтобы не нарушить время. Вы можете попробовать такие инструменты, как инструментарий трассировки Linux (требуется патч ядра) и посмотреть, можно ли извлечь полезную информацию; это та область, где я ожидаю, что Solaris будет иметь лучший инструмент (но я не знаю об этом).

      Если у вас есть источник, лучшим вариантом может быть добавление инструкций трассировки к ключевым функциям библиотеки. Это может быть достигнуто с помощью трюков LD_PRELOAD даже если у вас нет (цельного) источника, если у вас достаточно понимание потока управления частью программы, которая обращается к общей памяти.

    Это покажет, что процесс читает и пишет:

     strace -ewrite -p $PID 

    Это не чистый результат (показывает строки вроде: write (#,)), но работает! (и является однострочным: D) Возможно, вам также не понравится тот факт, что аргументы сокращены. Для управления этим параметром -s, который устанавливает максимальную длину строк.

    Он захватывает все потоки, поэтому вы можете каким-то образом отфильтровать их.

    Вы можете отфильтровать его:

     strace -ewrite -p $PID 2>&1 | grep "write(1" 

    показывает только вызовы дескриптора 1. 2> & 1 – перенаправить stderr на stdout, поскольку strace записывает stderr по умолчанию.

    Linux и Unix - лучшая ОС в мире.