У меня есть два процесса Linux, взаимодействующих через безымянный канал. Как можно следить за трафиком в трубе? Как я могу ввести данные в канал? У меня есть доступ с правами root и я знаю трубу inode.
2 ответа
Безымянный канал по своей природе является частным для приложений, которые имеют дескриптор файла. Нет принципиального способа наблюдать или изменять трафик на канале. Я не думаю, что есть способ взглянуть на канал непосредственно в Linux.
Однако существует беспринципный способ более или менее делать то, что вам нужно: через системный вызов ptrace . Вы бы не привязывались к трубе как таковой, а к одному из процессов. Для наблюдения используйте strace, например
strace -p1234 -s99999 -e write
где 1234
- это идентификатор процесса, который пишет в канал. Изменение данных сложнее, но может быть сделано. Я думаю, что самым простым способом было бы сначала настроить промежуточный процесс, который копирует его стандартный ввод в стандартный вывод, плюс данные, которые вы хотите ввести (и минус любые данные, которые вы хотите подавить). Создайте два именованных канала и запустите этот промежуточный процесс с помощью stdin на одном канале и stdout на другом. Затем используйте отладчик (например, GDB), чтобы оба целевых процесса выполнялись open
в соответствующем именованном канале, затем выполните dup
чтобы поместить канал в соответствующий дескриптор файла. Обратите внимание, что есть вероятность того, что вы сломаете один из процессов в этом процессе.
(Если вы не понимаете последний абзац, извините, но он требует определенного уровня техники. Я не думаю, что есть более простой способ.)
Некоторые инструменты, полезные для мониторинга канала:
Для уже работающей программы, в которой никто не контролирует трубопровод, см. Метод gdb:
Перенаправление вывода из запущенного процесса.
Или можно использовать strace :
strace -ewrite -p $PID 2>&1 | grep "write(1"
показывает только дескриптор 1 вызовов. «2> & 1» - перенаправить stderr в stdout, так как strace записывает в stderr по умолчанию.