Присоединить программу к процессу stdout / stderr - PullRequest
2 голосов
/ 21 октября 2011

У меня есть программа, в которой мне нужно присоединиться к stdout / stderr данного pid (извлекается из файла). Как это сделать? Возможно ли это?

РЕДАКТИРОВАТЬ 1:

У меня есть программа монитора, которая запускает / останавливает серверную программу. Однако монитор может быть закрыт / открыт повторно и должен подключиться к существующему серверному стандартному выводу, чтобы прочитать ошибки, записанные в стандартный вывод (а также некоторые выходные данные, основанные на некоторых запросах монитора).

РЕДАКТИРОВАТЬ 2:

Я построил сервер и монитор, поэтому у меня есть источники обоих, проблема в том, что сервер "отвечает" на некоторые запросы монитора на стандартный вывод, я не хочу добавлять другую часть взаимодействия между процессами

Ответы [ 3 ]

2 голосов
/ 21 октября 2011

Во время выполнения процесса не существует стандартного способа Unix для перехвата его вывода из другого процесса и начала его захвата после запуска целевого процесса.

Если вы запускаете эти процессы самостоятельно, с помощью execve, вы можете просто настроить канал с помощью pipe(2) и перенаправить его дескрипторы (с помощью dup2(2)) на дочерний процесс 'stdin и stdout. Таким образом, родитель сможет писать / читать в стандартный поток / стандартный вывод ребенка через канал.

Относительно вашего вопроса после редактирования: похоже, он подходит для файла Unix fifo.

Файл fifo (или именованный канал) выглядит как файл, но реализован как канал под капотом.

Итак, просто создайте файл fifo (с помощью команды mkfifo(1)), запустите серверное приложение, перенаправив его дескрипторы stdin и stdout в этот файл (с помощью операторов оболочки < и >), и вы смогу читать с него в любое время.

1 голос
/ 21 октября 2011

Никогда не пробовал, но вы можете заглянуть в каталог / proc / $ pid /, если возможно (с соответствующими разрешениями) прикрепить туда записи дескриптора файла.В противном случае я не мог представить, как это было бы возможно.


РЕДАКТИРОВАТЬ (после получения более подробной информации)

Вы заявляете, что ваш процесс будет ответственным за запуск / остановку этого процесса сервера- Это делает все намного проще:)

Поскольку это домашнее задание, я просто нарисую картинку:

  • создание именованных каналов для сервера stdin и stdout

  • при запуске сервера подключите его stdin / stdout с именованными каналами

  • при запуске клиента, чтение / запись из / в именованные каналы

0 голосов
/ 21 октября 2011

Есть ли у вас возможность настроить сервер таким образом, чтобы он отправлял вывод в файл журнала вместо или в дополнение к stdout?На Unix-сервере вы можете запустить сервер через tee для записи stdout в файл:

$ server | tee server.log

Тогда очень просто подключить server.log, чтобы получить последний вывод.

$ tail -f server.log
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...