Чтение стандартного вывода из процесса (встроенный в Linux)

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

Немного предыстории: мы разрабатываем приложение на C ++, работающее на встроенном ARM sbc, с использованием облегченного варианта debian linux. Приложение запускается при загрузке, запускаемом загрузочным скриптом, и выводит различную информацию на стандартный вывод. Мы хотели бы иметь возможность подключаться с помощью SSH / Telnet и читать выходные данные приложения без необходимости останавливать процесс и перезапускать его для текущего сеанса bash. Я хочу создать простой сценарий .sh для людей, не разбирающихся в технологиях.

Первое решение для аналогичных вопрос, размещенный здесь, заключается в использовании gdb. Во-первых, это неудобно (нужно писать несколько команд вручную), и мне интересно, почему, но, похоже, он ничего не выводит в файл.

Второе решение strace -ewrite -p PID работает отлично, вот чего я хочу. Проблема в том, что информации намного больше, чем просто стандартный вывод, и она плохо отформатирована.

Мне удалось получить "приемлемый" результат с strace -e write=1 -s 1024 -p 20049 2>&1 | grep "write(1,", но все еще есть лишний write(1, "...", 19) = 19 текст. До этого момента это просто форматирование строки, и я нашел на нескольких других страницах эту строку, в которой говорится, что она обеспечивает хорошее форматирование: strace -ff -e write=1,2 -s 1024 -p PID 2>&1 | grep "^ |" | cut -c11-60 | sed -e 's/ //g' | xxd -r -p

Есть некоторые вещи, которые я нахожу странными в этой команде (почему -ff?, Почему grep "^ |"?, Зачем там использовать xxd?), И она просто ничего не выводит, когда я пробую ее.

К сожалению, мы используем старую версию busybox с ошибками (1.7.1), у которой есть проблемы с несколькими каналами. Эта ошибка дает мне плохие результаты. Например, если я использую только grep, он работает, и если я только разрезаю, он также работает, но допустим, что «grep» write (1, «| cut -c11-60» ничего не возвращает.

Я знаю, что реальным решением было бы просто обновить busybox и использовать эти несколько каналов для форматирования строки, но мы не можем обновить его, поскольку дистрибутив ОС уже установлен на тысячах плат, отправленных нашим клиентам по всему миру.

У кого-нибудь есть чудесное решение? Спасибо


person Dunge    schedule 10.02.2012    source источник
comment
В вашем облегченном Linux есть экран программы или вы можете создать для него экран?   -  person John Zwinck    schedule 11.02.2012
comment
Экрана нет, но, вероятно, его можно было бы легко собрать. Похоже, это могло бы работать отлично, но мне не нравится тот факт, что, в отличие от strace, screen должен быть родительским процессом вашего приложения и не может просто подключиться к уже запущенному.   -  person Dunge    schedule 13.02.2012


Ответы (1)


Экран можно подключить к существующему процессу с помощью reptyr (http://blog.nelhage.com/2011/01/reptyr-attach-a-running-process-to-a-new-terminal/), или вы можете использовать neercs (http://caca.zoy.org/wiki/neercs), который я не использовал, но, по-видимому, похож на экран, но поддерживает подключение к существующему процессу сам по себе.

person John Zwinck    schedule 14.02.2012