2012-02-10 2 views
0

Прежде чем помечать вопрос как дубликат, прочитайте мои различные проблемы, с которыми я столкнулся.Чтение stdout из процесса (linux embedded)

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

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

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

Мне удалось получить «приемлемый» результат с 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 и использовать эти несколько каналов для форматирования строки, но мы не можем ее обновить, так как дистрибутив os уже установлен на тысячах плат, доставляемых нашим клиентам по всему миру.

У любого есть чудесные решение? Спасибо

+0

Есть ли у вас «lite» Linux с программным «экраном» или вы можете создать для него экран? –

+0

Экран нет, но, вероятно, можно легко построить. Похоже, что это может отлично работать, но мне не нравится тот факт, что в отличие от strace, экран должен быть родительским процессом вашего приложения и не может просто подключиться к уже запущенному. – Dunge

ответ

0

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

Смежные вопросы